这是从网上找的代码,但有以下两个缺陷:
1、不支持从内存中解析png图片。
2、生成的图片数据中不包含alpha数据,既使png图中带有alpha数据。
继续查找cximage移植ndk.
unsigned char* readpng(const char* file, png_uint_32* w, png_uint_32* h,
bool* hasAlpha) {
LOGI(“readPng 1”);
FILE* f;
unsigned char sig[8];
png_structp png_ptr;
png_infop info_ptr;
unsigned char* image_data;
int bit_depth;
int color_type;
unsigned int rowbytes;
png_uint_32 i;
png_bytepp row_pointers;
LOGI(“readPng 2”);
if ((f = fopen(file, “rb”)) == NULL)
return NULL;
fread(sig, sizeof(*sig), sizeof(sig), f);
// if (!png_check_sig(sig, sizeof(*sig))) {
// fclose(f);
// return NULL;
// }
LOGI(“readPng 3”);
if ((png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL,
NULL)) == NULL) {
fclose(f);
return NULL;
}
if ((info_ptr = png_create_info_struct(png_ptr)) == NULL) {
png_destroy_read_struct(&png_ptr, NULL, NULL);
fclose(f);
return NULL;
}
LOGI(“readPng 4”);
if (setjmp(png_jmpbuf(png_ptr))) {
png_destroy_read_struct(&png_ptr, &info_ptr, NULL);
fclose(f);
return NULL;
}
LOGI(“readPng 4.1”);
// png_ptr->io_ptr = (png_voidp) f;
png_init_io(png_ptr, f); // fuck,加上这一句就OK了
png_set_sig_bytes(png_ptr, 8);
LOGI(“readPng 4.2”);
png_read_info(png_ptr, info_ptr);
LOGI(“readPng 4.3”);
png_get_IHDR(png_ptr, info_ptr, w, h, &bit_depth, &color_type, NULL, NULL,
NULL);
LOGI(“readPng 5”);
if (color_type & PNG_COLOR_MASK_ALPHA) {
png_set_strip_alpha(png_ptr);
*hasAlpha = true;
}
if (bit_depth == 16)
png_set_strip_16(png_ptr);
if (color_type == PNG_COLOR_TYPE_GRAY || color_type
== PNG_COLOR_TYPE_GRAY_ALPHA)
png_set_gray_to_rgb(png_ptr);
if (color_type == PNG_COLOR_TYPE_PALETTE)
png_set_palette_to_rgb(png_ptr);
png_read_update_info(png_ptr, info_ptr);
LOGI(“readPng 6”);
rowbytes = png_get_rowbytes(png_ptr, info_ptr);
if ((image_data = (unsigned char *) malloc(*h * rowbytes)) == NULL) {
png_destroy_read_struct(&png_ptr, &info_ptr, NULL);
fclose(f);
return NULL;
}
if ((row_pointers = (png_bytepp) malloc(*h * sizeof(png_bytep))) == NULL) {
png_destroy_read_struct(&png_ptr, &info_ptr, NULL);
fclose(f);
free(image_data);
return NULL;
}
for (i = 0; i < *h; i++)
row_pointers[*h – 1 – i] = image_data + i * rowbytes;
png_read_image(png_ptr, row_pointers);
free(row_pointers);
png_destroy_read_struct(&png_ptr, &info_ptr, NULL);
fclose(f);
// FILE* f2=fopen(“/sdcard/2.png”, “w”);
// fwrite(image_data,*h * rowbytes,1,f2);
// fclose(f2);
return image_data;
}
0 条评论。