使用libpng将转换设置为灰度

时间:2012-12-18 09:12:31

标签: c++ 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包含一些我感兴趣的图像信息,因为它可以在代码中看到。

问题是,代码执行后,通道数不会改变。怎么解决这个问题?

1 个答案:

答案 0 :(得分:1)

运算符优先级问题:

//alpha通道被移除 if ( ( info->color_type & PNG_COLOR_MASK_ALPHA ) != PNG_COLOR_TYPE_GRAY)

运算符&的优先级小于运算符!=