特定のpng画像をロードする際にいくつかの問題に直面しています。ここにいくつかの役立つ画像があります。
- 画像 #1 www.silexars.com/image.png (正しく読み込まれません)
- 画像 #2 www.silexars.com/image2.png (正常に読み込まれます)
- OpenGL でレンダリングされた画像 #1 のスクリーンショット http://www.silexars.com/screenshot.jpg
- 両方の画像を開いた状態の PNG Analyzer のスクリーンショット: http://www.silexars.com/screenshot.png画像 #1 @ 左、画像 #2 @ 右
左の画像には cHRM と呼ばれるチャンクがあることに気付きました。どうにかして変換する必要があると思います。誰かがこの問題で私を助けてくれますか?
PNGファイルをロードするために使用しているコードは次のとおりです。
uint8 Graphics::Image::loadPNG(FILE *fp) {
uint8 header[8];
fread(header,sizeof(header),1,fp);
if (png_sig_cmp(header,0,sizeof(header))) return INVALID_FILE;
png_structp png;
png_infop info;
png = png_create_read_struct(PNG_LIBPNG_VER_STRING,0,0,0);
if (!png) return FAILURE;
info = png_create_info_struct(png);
if (!info) {
png_destroy_read_struct(&png,0,0);
return FAILURE;
}
png_init_io(png,fp);\
png_set_sig_bytes(png,sizeof(header));
png_read_info(png,info);
delete[] data;
data = 0;
int32 bitdepth,colortype;
png_get_IHDR(png,info,&width,&height,&bitdepth,&colortype,0,0,0);
if (colortype == PNG_COLOR_TYPE_PALETTE) {
png_set_palette_to_rgb(png);
}
if (colortype == PNG_COLOR_TYPE_GRAY && bitdepth < 8) {
png_set_expand_gray_1_2_4_to_8(png);
}
if (colortype == PNG_COLOR_TYPE_GRAY || colortype == PNG_COLOR_TYPE_GRAY_ALPHA) {
png_set_gray_to_rgb(png);
}
if (png_get_valid(png, info, PNG_INFO_tRNS)) {
png_set_tRNS_to_alpha(png);
}
if (colortype == PNG_COLOR_TYPE_RGB) {
png_set_filler(png, 0xff, PNG_FILLER_AFTER);
}
if (bitdepth == 16) {
png_set_strip_16(png);
}
if (bitdepth < 8)
png_set_packing(png);
png_read_update_info(png,info);
png_get_IHDR(png,info,&width,&height,0,0,0,0,0);
int32 rowbytes = png_get_rowbytes(png,info);
std::cout << rowbytes/bpp << std::endl;
data = new uint8[rowbytes*height];
png_bytep *row_pointers = new png_bytep[height*sizeof(png_bytep)];
for (int i = 0; i < height; i++)
row_pointers[height-1-i] = data + i * rowbytes;
png_read_image(png, row_pointers);
png_read_end(png,0);
delete[] row_pointers;
png_destroy_read_struct(&png,&info,0);
return OK;
}
情報が十分であることを願っています。しかし、追加のデータが必要な場合は、私に尋ねてください.