我使用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包含一些我感兴趣的图像信息,因为它可以在代码中看到。
问题是,代码执行后,通道数不会改变。怎么解决这个问题?
答案 0 :(得分:1)
运算符优先级问题:
//alpha通道被移除 if ( ( info->color_type & PNG_COLOR_MASK_ALPHA ) != PNG_COLOR_TYPE_GRAY)
运算符&的优先级小于运算符!=