Преобразование цветного изображения в черно-белое C#

В статье рассмотрим алгоритм перевода цветного изображения в черно-белое и напишем его реализацию на языке C#. Приводится исходный код программы, написанной в Visual Studio – приложение Windows Forms.

Сразу оговоримся, что под преобразованием в черно-белое изображение будем понимать преобразование в оттенки серого. В рамках данного материала эти два понятия используются как синонимы.

Алгоритм преобразования в черно-белое изображение

Каждый пиксель изображения формируется при помощи сочетания четырех каналов: ARGB (Alpha, Red, Green, Blue), альфа-канала, красного, зеленого и синего.

Альфа-канал отвечает за прозрачность пикселя (100% – пиксель полностью непрозрачный, 0% – полностью прозрачный).

Сочетание значений RGB каналов определяет цвет пикселя.

Каждый канал несёт в себе 8 бит информации (1 байт), соответственно интенсивность канала может меняться в диапазоне от 0 до 255. Полностью пиксель занимает в памяти 32 бита (4 байта).

Для того, чтобы преобразовать цветное изображение в черно-белое, нужно найти среднее арифметическое значение R, G и B каналов пикселя и затем это значение присвоить RGB каналам этого же пикселя (то есть оно будет одинаковое). Альфа-канал оставляем без изменений.

Такую операцию нужно проделать с каждым пикселем изображения.

Программа для преобразования цветного изображения в черно-белое

Приступим к написанию приложения Windows Forms в среде разработки Visual Studio на языке программирования C#.

Создадим новый проект программы и разместим на форме 3 кнопки (Button) и два контейнера под изображения PictureBox. Кнопки понадобятся для: открытия изображения, преобразования в черно-белое (в оттенки серого) и сохранения преобразованной картинки на компьютер.

Свойства кнопок Text изменим на:

  • Открыть
  • Ч/Б
  • Сохранить

Имена кнопок (Name), используемые при разработке, изменим на:

  • openButton
  • grayButton
  • saveButton

Размеры обоих PictureBox (Size) сделаем равными 400 x 400 пикселей.

Чтобы вокруг границ PictureBox отображалась рамка в виде сплошной тонкой линии, установим значение свойства BorderStyle в положение FixedSingle.

Также у PictureBox свойство SizeMode сделаем равным Zoom. Данная настройка позволит автоматически масштабировать отображаемые изображения в соответствии с размером PictureBox, при этом сохраняя соотношения сторон исходной картинки.

Интерфейс программы для преобразования изображения в черно-белое

Перейдём к написанию кода. Сначала закодируем обработку нажатий кнопок “Открыть” и “Сохранить”:

Подробнее про открытие и сохранение картинки из PictureBox можно прочитать в соответствующих статьях на нашем сайте:

Как загрузить картинку в PictureBox C#

Сохранить изображение из PictureBox C#

Теперь напишем код кнопки, преобразующей цветное изображение в оттенки серого:

Отдельно следует сказать про хранение значения пикселя в программе и про получение значений отдельных каналов.

Пиксель мы храним в структуре UInt32. Она предназначена для хранения беззнакового целого 4-х байтового (32 бита) числа. Диапазон значений такого числа от 0 до 232 – 1; такой диапазон идеально подходит для хранения значения пикселя – он туда помещается полностью, поскольку занимает также 32 бита.

Для получения значения конкретного канала используется побитовое умножение значения пикселя на битовую маску для соответствующего цвета с последующим сдвигом вправо на нужное количество бит (строки 17-19).

Сборка пикселя из каналов воедино происходит с использованием операций сдвига влево (для каждого канала) и последующим логическим сложением всех компонент (строка 23). Альфа-канал примем равным 0xFF000000 (FF16 = 25510).

Проверим работу программы:

Преобразование цветного изображения в черно-белое C#

Исходник программы и репозиторий на GitHub:

Скачать исходник Репозиторий проекта на GitHub

 

 

Также посмотрите видеоурок, в котором мы дополнительно объясняем написание программы для преобразования цветного изображения в оттенки серого (черно-белое):

Преобразование цветного изображения в черно-белое C#
5 (100%) 7 votes

Поделиться в соц. сетях:

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">