我正在加載一些特定的PNG圖像時遇到一些問題。這裏有一些有用的圖像。如何用LIBPNG加載Photoshop PNG?
- 圖像#1 www.silexars.com/image.png(不正確加載)
- 影像#2 www.silexars.com/image2.png(載荷細)
- 截圖圖像的#1渲染使用OpenGL PNG分析儀http://www.silexars.com/screenshot.jpg
- 截圖與兩個圖像打開: 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;
}
希望的信息就足夠了。但是如果你需要任何額外的數據,請問我。