c++ - 使用 libpng 将转换设置为灰度

标签 c++ libpng

我正在使用 libpng 读取图像。图像本身有 4 个 channel (rgba), channel 有 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 包含一些我感兴趣的图像信息,可以在代码中看到。

问题是,代码执行后, channel 数没有改变。如何解决?

最佳答案

运算符优先级问题:

//alpha channel 被移除 如果 ( ( info->color_type & PNG_COLOR_MASK_ALPHA ) != PNG_COLOR_TYPE_GRAY)

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

关于c++ - 使用 libpng 将转换设置为灰度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13929632/

相关文章:

C++:如何获取文件夹列表

c++ - 此函数是否在所有控制路径上都有明确的返回值?

c++编译错误链接器命令失败

使用 MinGW 为 Windows 构建 Cairo(链接 libpng 的问题)

c++ - 人为限制的ostream

用于存储最新值的 C++ 固定大小容器

c++ - FreeType2 my_draw_bitmap 未定义

c++ - 使用fopen打开.pak文件并将该文件应用于const unsigned char *(C++)

c++ - 为什么同时链接libpng和opencv没有冲突?

gradle - 在Gradle构建过程中跳过处理文件