【问题标题】:Setting transformations to greyscale with libpng使用 libpng 将转换设置为灰度
【发布时间】:2012-12-05 11:05:31
【问题描述】:

我正在使用 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 包含一些我感兴趣的图像信息,可以在代码中看到。

问题是,代码执行后,通道数没有变化。怎么解决?

【问题讨论】:

    标签: c++ libpng


    【解决方案1】:

    运算符优先级问题:

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

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

    【讨论】:

      猜你喜欢
      • 2011-06-02
      • 2011-05-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-29
      • 2020-04-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多