Установка преобразований в оттенки серого с помощью libpng

Я использую libpng для чтения изображения. Само изображение имеет 4 канала (rgba), с 8 битами для канала. Я хочу прочитать его как изображение в оттенках серого, предпочтительно черно-белое (1 бит на пиксель), но даже 8 бит на пиксель будет улучшением.

Для этого я написал следующую функцию:

extern "C" void cuttingStream::set_image_transformations_in_grayscale( pngImageInfo* info,pngDataStructures* png)
{
//alpha channel is removed
if (info->color_type & PNG_COLOR_MASK_ALPHA != PNG_COLOR_TYPE_GRAY)
png_set_strip_alpha(png->png_struct_field);
//switch to rgb is completed
if (info->color_type & PNG_COLOR_MASK_COLOR != PNG_COLOR_TYPE_GRAY)
png_set_rgb_to_gray(png->png_struct_field,1,NULL,NULL);
png_read_update_info(png->png_struct_field, png->png_info_field);

info -> rowbytes = png_get_rowbytes(png->png_struct_field, png->png_info_field);
//bits per CHANNEL! note: not per pixel!
info->bitdepth   = png_get_bit_depth(png->png_struct_field, png->png_info_field);
//Number of channels
info->channels   = png_get_channels(png->png_struct_field, png->png_info_field);
//Color type. (RGB, RGBA, Luminance, luminance alpha... palette... etc)
info->color_type = png_get_color_type(png->png_struct_field, png->png_info_field);
}

pngDataStructures — моя собственная структура, которая содержит такие вещи, как png_structp, png_infop и указатели на пользовательские функции чтения. pngImageInfo содержит некоторую информацию об изображении, которая мне интересна, как это видно из кода.

Проблема в том, что после выполнения кода количество каналов не меняется. Как это можно решить?

3

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]