Используйте объект ImageAttributes для преобразования изображения в оттенок сепии в C#
В этом примере был изменен предыдущий пример Использовать объект ImageAttributes для преобразования изображения в монохромный в C# для преобразования изображения в оттенок сепии.
В этом примере используется ColorMatrix, который дает цветовым компонентам результирующего пикселя разные значения, которые перемещают цвет в сторону коричневатого цвета сепии. Если исходными цветовыми компонентами пикселя являются R, G и B, то новые значения компонентов:
new_R = R * 0.393 + G * 0.769 + B * 0.189 new_G = R * 0.349 + G * 0.686 + B * 0.168 new_B = R * 0.272 + G * 0.534 + B * 0.131
Следующий метод ToSepiaTone преобразует изображение в тон сепии.
// Преобразование изображения в оттенок сепии. private Bitmap ToSepiaTone(Image image) { // Создаем ColorMatrix. ColorMatrix cm = new ColorMatrix(new float[][] { new float[] {0.393f, 0.349f, 0.272f, 0, 0}, new float[] {0.769f, 0.686f, 0.534f, 0, 0}, new float[] {0.189f, 0.168f, 0.131f, 0, 0}, new float[] { 0, 0, 0, 1, 0}, new float[] { 0, 0, 0, 0, 1} }); ImageAttributes attributes = new ImageAttributes(); attributes.SetColorMatrix(cm); // Нарисуем изображение на новом растровом изображении // применение новой ColorMatrix. Point[] points = { new Point(0, 0), new Point(image.Width, 0), new Point(0, image.Height), }; Rectangle rect = new Rectangle(0, 0, image.Width, image.Height); // Создаем растровое изображение результата. Bitmap bm = new Bitmap(image.Width, image.Height); using (Graphics gr = Graphics.FromImage(bm)) { gr.DrawImage(image, points, rect, GraphicsUnit.Pixel, attributes); } // Вернуть результат. return bm; }
Значения, используемые для инициализации ColorMatrix, преобразуют цветовые компоненты по желанию. См. Пример
В этом примере изображение преобразуется в оттенок сепии, но вы можете получить некоторые интересные результаты, введя значения в ColorMatrix. Например, следующие значения делают своего рода «фиолетовый тон».
ColorMatrix cm = new ColorMatrix(new float[][] { new float[] {0.300f, 0.066f, 0.300f, 0, 0}, new float[] {0.500f, 0.350f, 0.600f, 0, 0}, new float[] {0.100f, 0.000f, 0.200f, 0, 0}, new float[] { 0, 0, 0, 1, 0}, new float[] { 0, 0, 0, 0, 1} });