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 には、コードでわかるように、私にとって興味深い画像に関する情報が保持されています。
問題は、コードの実行後、チャネル数が変わらないことです。これはどのように解決できますか?