1

特定のpng画像をロードする際にいくつかの問題に直面しています。ここにいくつかの役立つ画像があります。

  1. 画像 #1 www.silexars.com/image.png (正しく読み込まれません)
  2. 画像 #2 www.silexars.com/image2.png (正常に読み込まれます)
  3. OpenGL でレンダリングされた画像 #1 のスクリーンショット http://www.silexars.com/screenshot.jpg
  4. 両方の画像を開いた状態の 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;
}

情報が十分であることを願っています。しかし、追加のデータが必要な場合は、私に尋ねてください.

4

1 に答える 1