使用libpng库读PNG图片

使用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);

猜你喜欢

转载自blog.csdn.net/chen_227/article/details/127420397
今日推荐