Как я могу проверить глубину цвета растрового изображения?

Я работаю над приложением, которое печатает папку с файлами изображений, включая JPEG и TIFF. Изображения TIFF обычно черно-белые (1bpp).

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

Я использую конструктор Bitmap image = new Bitmap(filename); для загрузки изображения.

EDIT: Ответ на проверку глубины пикселя отлично подходит для черно-белого изображения. Любые идеи о том, как проверить, является ли изображение в градациях серого без повторения каждого пикселя?


person Chris Thompson    schedule 27.01.2010    source источник
comment
Используйте его свойство PixelFormat.   -  person Neil    schedule 28.01.2010


Ответы (2)


Правильный способ проверить это:

Для файлов JPEG следует проверить соответствующие свойства с помощью PropertyItems. коллекция растровых изображений. Он может содержать соответствующие теги EXIF для Помогите определить разрядность. Следующим шагом будет анализ заголовка JPEG и поиск 'начала кадра ', а затем количество компонентов в изображении.

Последний способ — загрузить JPEG в объект Bitmap и сравнить количество пикселей с форумлой (ширина * высота * байт_на_пиксель). Итак, если вы загружаете растровое изображение и количество байтов фактических необработанных данных равно (ширина * высота), то вы знаете, что это безопасная ставка, что изображение имеет 1 байт на пиксель и, как таковое, имеет оттенки серого.

Последнее, что вам нужно проверить, это PixelFormat самого растрового изображения.

Для формата файла TIFF вы должны сделать то же самое, используя коллекцию PropertyItems и проверьте соответствующий тег, указанный в спецификации. Если это не удается, выполните сравнение байтов изображения и, наконец, используйте свойство PixelFormat в качестве последнего средства.

person Community    schedule 28.01.2010
comment
Честно говоря, не уверен, как вы должны определить количество байтов фактических необработанных данных в формате jpeg. В конце концов, файл jpeg сжат. И, хотя я предполагаю, что это верно для jpeg, изображения с размером 1 байт на пиксель, как правило, представляют собой просто 8-битные индексированные изображения, а не обязательно оттенки серого. - person Nyerguds; 24.10.2020

Просто проверьте это свойство

image.PixelFormat

Оно будет соответствовать одному из значений в System. Drawing.Imaging.PixelFormat

Хотя вы хотели бы отправить на черно-белый принтер больше, чем просто черно-белые, вы также должны отправить туда любые оттенки серого.

person Neil N    schedule 27.01.2010
comment
Сумасшедший, я просмотрел список членов класса Bitmap, не зная, как я его пропустил. - person Chris Thompson; 28.01.2010
comment
Я еще не принял ответ, потому что проверял его. Я тоже думал о том, как проверить оттенки серого. Возможно, мне следует отредактировать вопрос, чтобы уточнить это. - person Chris Thompson; 28.01.2010