int load_png(char *base_name, int *format, int *bpp, u8 *data, int *llen, int *width, int *height, u8 *plt, int *nplt)
{
png_structp png_ptr;
png_infop info_ptr, end_ptr;
png_colorp pcolor;
png_bytep *rows, ptrans;
int i;
char png_name[256];
FILE *fp;
sprintf(png_name, "%s.png", base_name);
fp = fopen(png_name, "rb");
if(fp==NULL){
//printf("Can't open %s!\n", png_name);
return -1;
}
/* create info */
png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
if(png_ptr==NULL){
printf("PNG error create png_ptr!\n");
return -1;
}
info_ptr = png_create_info_struct(png_ptr);
if(info_ptr==NULL){
printf("PNG error create info_ptr!\n");
png_destroy_read_struct(&png_ptr, (png_infopp)NULL, (png_infopp)NULL);
return -1;
}
end_ptr = png_create_info_struct(png_ptr);
if(info_ptr==NULL){
printf("PNG error create info_ptr!\n");
png_destroy_read_struct(&png_ptr, &info_ptr, (png_infopp)NULL);
return -1;
}
/* read info chunks */
png_init_io(png_ptr, fp);
png_read_info(png_ptr, info_ptr);
/* read header */
png_get_IHDR(png_ptr, info_ptr, (png_uint_32*)width, (png_uint_32*)height, bpp, format, NULL, NULL, NULL);
if(*format==PNG_COLOR_TYPE_PALETTE) {
/* read palette */
png_get_PLTE(png_ptr, info_ptr, &pcolor, nplt);
for(i=0; i<*nplt; i++){
plt[i*4+0] = pcolor[i].red;
plt[i*4+1] = pcolor[i].green;
plt[i*4+2] = pcolor[i].blue;
plt[i*4+3] = 0xff;
}
/* read alpha of palette */
if(png_get_valid(png_ptr, info_ptr, PNG_INFO_tRNS)){
png_get_tRNS(png_ptr, info_ptr, (png_bytep*)&ptrans, NULL, NULL);
for(i=0; i<*nplt; i++){
plt[i*4+3] = ptrans[i];
}
}
}else{
*nplt = 0;
}
/* read image data */
*llen = png_get_rowbytes(png_ptr, info_ptr);
rows = (png_bytep*)malloc(*height*sizeof(char*));
for(i=0; i<*height; i++){
rows[i] = (png_bytep)(data+(*llen)*i);
}
png_read_image(png_ptr, rows);
free(rows);
png_read_end(png_ptr, info_ptr);
png_destroy_read_struct(&png_ptr, &info_ptr, &end_ptr);
return 0;
}
png格式读取测试
最新推荐文章于 2023-03-03 08:12:09 发布