Уважаемый all, кто знает матрицу преобразования цветов, которая может задавать яркость и контрастность для изображения?
т.е я хочу, применяя функцию DrawImage с использованием аргумента ImageAttributes, управлять яркостью и контрастностью картинки.
Здравствуйте, 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;
это немного не то) мне нужна яркость и контрастность, а не серое и sepia. Уровень яркости и контрастности должен быть параметром, входящим в матрицу.
посмотрел, яркость = макс. значению из R, G, B. то есть чтоб изменить яркость, надо изменить канал с максимальным значением. умножением на константную матрицу не получится, тут надо обрабатывать изображение.