使用libpng库读PNG图片
void read_png_image(string path, unsigned char **data, int* s)//"icon1.png"
{
FILE* fp;
fp = fopen((char*)path.c_str(), "rb");
if (!fp) {
printf("no file\n");
return;
}
png_structp png_ptr;
png_infop info_ptr;
int m_width, m_height;
png_ptr = png_create_read_struct(png_get_libpng_ver(NULL), NULL, NULL, NULL);
info_ptr = png_create_info_struct(png_ptr);
if (info_ptr == NULL) {
printf("info_ptr == NULL\n");
png_destroy_read_struct(&png_ptr, &info_ptr, NULL);
return;
}
setjmp(png_jmpbuf(png_ptr));
//{
// printf("setjmp == NULL\n");
// png_destroy_read_struct(&png_ptr, &info_ptr, NULL);
// return;
//}
#define PNG_BYTES_TO_CHECK 4
char buf[PNG_BYTES_TO_CHECK];
int temp = fread(buf, 1, PNG_BYTES_TO_CHECK, fp);
if (temp < PNG_BYTES_TO_CHECK) {
fclose(fp);
printf("PNG_BYTES_TO_CHECK == NULL\n");
png_destroy_read_struct(&png_ptr, &info_ptr, NULL);
return;
}
temp = png_sig_cmp((png_bytep)buf, (png_size_t)0, PNG_BYTES_TO_CHECK);
if (temp!=0) {
fclose(fp);
printf("no png == NULL\n");
png_destroy_read_struct(&png_ptr, &info_ptr, NULL);
return;
}
rewind(fp);
png_init_io(png_ptr, fp);
//png_set_sig_bytes(png_ptr, 8);
//png_read_info(png_ptr, info_ptr);
png_read_png(png_ptr, info_ptr, PNG_TRANSFORM_EXPAND, 0);
// 得到文件的宽高色深
if ((png_ptr != NULL) && (info_ptr != NULL))
{
m_width = png_get_image_width(png_ptr, info_ptr);
m_height = png_get_image_height(png_ptr, info_ptr); //通过png库中的api获取图片的宽度和高度
printf("%s, %d, m_width =%d, m_height = %d\n", __FUNCTION__, __LINE__, m_width, m_height);
}
int color_type = png_get_color_type(png_ptr, info_ptr); //通过api获取color_type
printf("%s, %d, color_type = %d\n", __FUNCTION__, __LINE__, color_type);
int size = m_height * m_width * 4;
*s = size;
unsigned char *rgba = NULL;
rgba = (unsigned char *)malloc(size);
*data = rgba;
//printf("rgba=%x,data=%x;size=%d\n", rgba, data, size);
if (NULL == rgba)
{
printf("%s, %d, rgba == NULL\n", __FUNCTION__, __LINE__);
return;
}
int pos = 0;
// row_pointers里边就是传说中的rgb数据了
png_bytep* row_pointers = png_get_rows(png_ptr, info_ptr);
int i, j;
for (i = 0; i < m_height; i++)
{
for (j = 0; j < (4 * m_width); j += 4)
{
rgba[pos++] = row_pointers[i][j]; // red
rgba[pos++] = row_pointers[i][j + 1]; // green
rgba[pos++] = row_pointers[i][j + 2]; // blue
rgba[pos++] = row_pointers[i][j + 3]; // alpha
}
}
//for (i = 0; i < 12; i++ )
//{
// printf("%s, %d, rgba[%d] = %d\n", __FUNCTION__, __LINE__, i, rgba[i]);
//}
png_destroy_read_struct(&png_ptr, &info_ptr, 0);
fclose(fp);
printf("over\n");
}
调用该函数
unsigned char *data = NULL;
int s = 0;
read_png_image("icon1.png", &data, &s);