3

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 には、コードでわかるように、私にとって興味深い画像に関する情報が保持されています。

問題は、コードの実行後、チャネル数が変わらないことです。これはどのように解決できますか?

4

1 に答える 1