контрасть и яркость с помощью ImageAttributes
От: Termit  
Дата: 18.06.09 06:06
Оценка:
Уважаемый all, кто знает матрицу преобразования цветов, которая может задавать яркость и контрастность для изображения?
т.е я хочу, применяя функцию DrawImage с использованием аргумента ImageAttributes, управлять яркостью и контрастностью картинки.
Re: контрасть и яркость с помощью ImageAttributes
От: Pavel_Agurov Россия  
Дата: 20.06.09 15:07
Оценка: 6 (1)
Здравствуйте, Termit, Вы писали:

T>Уважаемый all, кто знает матрицу преобразования цветов, которая может задавать яркость и контрастность для изображения?

T>т.е я хочу, применяя функцию DrawImage с использованием аргумента ImageAttributes, управлять яркостью и контрастностью картинки.

Отсюда пойдет?

363. Изменение цветовой матрицы изображения
С помощью матрицы цветов можно изменять цвета изображения, не используя пиксельных преобразований.
Преобразование цветов изображения
Пусть в компоненте pictureBox1 загружена некоторая картинка (gif или jpg).
private System.Drawing.Imaging.ColorMatrix CreateSepiaMatrix()
{
// Задаем преобразование
// New Red = R*.1 + G*.4 + B*.7
// New Green = R*.2 + G*.5 + B*.8
// New Blue = R*.3 + G*.6 + B*.9
return new System.Drawing.Imaging.ColorMatrix(new float[][]
{
new float[] {0.1f, 0.4f, 0.7f, 0, 0},
new float[] {0.2f, 0.5f, 0.8f, 0, 0},
new float[] {0.3f, 0.6f, 0.9f, 0, 0},
new float[] { 0, 0, 0, 1, 0},
new float[] { 0, 0, 0, 0, 1}
});
}

private void button1_Click(object sender, System.EventArgs e)
{
// Получить изображение (jpg или gif)
Image img = pictureBox1.Image;

// Создать объект атрибутов изображения
System.Drawing.Imaging.ImageAttributes imageAttrs =
new System.Drawing.Imaging.ImageAttributes();
// Создать атрибуты по матрице преобразования
imageAttrs.SetColorMatrix(CreateSepiaMatrix());
// Нарисовать новое изображение с помощью преобразования
using(Graphics g = Graphics.FromImage(img))
{
g.DrawImage(img, new Rectangle(0, 0, img.Width, img.Height),
0, 0, img.Width, img.Height, GraphicsUnit.Pixel, imageAttrs);
}
// Обновить рисунок
pictureBox1.Invalidate();
}
Создание серого изображения
Серое изображение создается с помощью указания новых атрибутов (листинг 207).
Листинг 212. Создание серого изображения
using System;
using System.Drawing;
using System.Drawing.Imaging;

namespace ImageGray
{
class Class1
{
[STAThread]
static void Main(string[] args)
{
// Загружаем входной файл
Bitmap bmp = new Bitmap(@"Add_IWshRuntimeLibrary.bmp");
// Атрибуты серого изображения
ImageAttributes ia = new ImageAttributes();
ColorMatrix cm = new ColorMatrix();
cm.Matrix00 = 1/3f;
cm.Matrix01 = 1/3f;
cm.Matrix02 = 1/3f;
cm.Matrix10 = 1/3f;
cm.Matrix11 = 1/3f;
cm.Matrix12 = 1/3f;
cm.Matrix20 = 1/3f;
cm.Matrix21 = 1/3f;
cm.Matrix22 = 1/3f;
ia.SetColorMatrix(cm);
// Рисуем серое
Graphics g = Graphics.FromImage(bmp);
g.DrawImage(bmp, new Rectangle(0, 0,
bmp.Width, bmp.Height), 0, 0,
bmp.Width, bmp.Height,
GraphicsUnit.Pixel, ia);
// Сохраняем выходной файл
bmp.Save("out.bmp");
}
}
}
Создание "затемненного" изображения
Для создания "затемненного" (как при выключении Windows) изображения используется матрица вида:
cm.Matrix00 = 0;
cm.Matrix11 = 0;
cm.Matrix22 = 0;
cm.Matrix33 = 0.25f;

Re: контрасть и яркость с помощью ImageAttributes
От: Termit  
Дата: 26.06.09 09:08
Оценка:
это немного не то) мне нужна яркость и контрастность, а не серое и sepia. Уровень яркости и контрастности должен быть параметром, входящим в матрицу.
Re[2]: контрасть и яркость с помощью ImageAttributes
От: tofox2 Россия  
Дата: 30.06.09 02:41
Оценка:
Здравствуйте, Termit, Вы писали:

T>это немного не то) мне нужна яркость и контрастность, а не серое и sepia. Уровень яркости и контрастности должен быть параметром, входящим в матрицу.


погуглите преобразование в другую цветовую модель и обратно. по крайней мере, яркость — это параметр V в модели HSV. из уравнений перехода между моделями наверное можно вывести нужную Вам матрицу.
Re[3]: контрасть и яркость с помощью ImageAttributes
От: tofox2 Россия  
Дата: 30.06.09 02:47
Оценка:
посмотрел, яркость = макс. значению из R, G, B. то есть чтоб изменить яркость, надо изменить канал с максимальным значением. умножением на константную матрицу не получится, тут надо обрабатывать изображение.
Re[4]: контрасть и яркость с помощью ImageAttributes
От: Termit  
Дата: 02.07.09 07:32
Оценка:
Здравствуйте, tofox2, Вы писали:

T>посмотрел, яркость = макс. значению из R, G, B. то есть чтоб изменить яркость, надо изменить канал с максимальным значением. умножением на константную матрицу не получится, тут надо обрабатывать изображение.


спасибо! к этому я и пришел, считываю массив пикселей и работаю с каждым по отдельности. Жаль что не удалось воспользоваться матрицей, по тестам работает она очень быстро, мое преобразование медленнее...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.