png格式读取测试

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;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值