asysbang

 找回密码
 立即注册
查看: 4807|回复: 0
打印 上一主题 下一主题

libpng使用的例子

[复制链接]

513

主题

2

好友

6404

积分

管理员

Rank: 80Rank: 80Rank: 80Rank: 80Rank: 80

最佳新人 活跃会员 热心会员 推广达人 宣传达人 灌水之王 突出贡献 优秀版主 荣誉管理 论坛元老

跳转到指定楼层
楼主
发表于 2014-6-20 10:38:22 |只看该作者 |倒序浏览
http://hi.baidu.com/ljp2010/item/d9858cf55753260b84d278a6



libpng是一个跨平台的png解码库,方便易用。我这里不说它怎么移植,基本上如果是支持fopen之类函数的平台都可以支持。其实他的移植非常简单,zlib可能麻烦一点,但相信一般人都能搞定。主要是文件读写和错误处理的试配。
这里只提供一个使用libpng得到文件RGB(A)数据的例子,没加任何的错误处理:
void readpng__001(char* name)
{
// 前边几句是扯淡,初始化各种结构
FILE* file = fopen(name, "rb");
png_structp png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, 0, 0, 0);
png_infop info_ptr = png_create_info_struct(png_ptr);
setjmp(png_jmpbuf(png_ptr));
// 这句很重要
png_init_io(png_ptr, file);
// 读文件了
png_read_png(png_ptr, info_ptr, PNG_TRANSFORM_EXPAND, 0);
// 得到文件的宽高色深
int m_width = png_get_image_width(PngPtr, InfoPtr);
int m_height = png_get_image_height(PngPtr, InfoPtr);
int color_type = png_get_color_type(PngPtr, InfoPtr);
// 申请个内存玩玩,这里用的是c++语法,甭想再c上编过
int size = m_height * m_width * 4;
unsigned char* bgra = new unsigned char[size];
int pos = 0;
// row_pointers里边就是传说中的rgba数据了
png_bytep* row_pointers = png_get_rows(PngPtr, InfoPtr);
// 拷贝!!注意,如果你读取的png没有A通道,就要3位3位的读。还有就是注意字节对其的问题,最简单的就是别用不能被4整除的宽度就行了。读过你实在想用,就要在这里加上相关的对齐处理。
for(int i = 0; i < m_height; i++)
{
   for(int j = 0; j < (4 * m_width); j += 4)
   {
    bgra[pos++] = row_pointers[j + 2]; // blue
    bgra[pos++] = row_pointers[j + 1]; // green
    bgra[pos++] = row_pointers[j];   // red
    bgra[pos++] = row_pointers[j + 3]; // alpha
   }
}
// 好了,你可以用这个数据作任何的事情了。。。把它显示出来或者打印出来都行。
png_destroy_read_struct(&png_ptr, &info_ptr, 0);
fclose(file);
return;
}


================下面获得grb值========
    unsigned char* rgba = new unsigned char[width * height * 4];
    png_bytep* row_pointers = png_get_rows(png_ptr, info_ptr);
    int pos = 0;
    for(int row = 0; row < height; row++)
    {
       for(int col = 0; col < (4 * width); col += 4)
       {
           rgba[pos] = row_pointers[row][col];        // red
           rgba[pos+1] = row_pointers[row][col + 1]; // green
           rgba[pos+2] = row_pointers[row][col + 2]; // blue
           rgba[pos+3] = row_pointers[row][col + 3]; // alpha
           if (row == 100 && col == 404) {
                   LOGE("============RED=%d",rgba[pos]);
                   LOGE("============GREEN=%d",rgba[pos+1]);
                   LOGE("============BLUE=%d",rgba[pos+2]);
                   LOGE("============ALPHA=%d",rgba[pos+3]);
           }
           pos+=4;
       }
    }
    png_destroy_read_struct(&png_ptr, &info_ptr, 0);
    fclose(fp);














回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

Archiver|手机版|aSys-帮 ( 京ICP备13033689号 )

GMT+8, 2024-10-5 19:11 , Processed in 0.044255 second(s), 19 queries .

Powered by Discuz! X2.5

© 2001-2012 Comsenz Inc.

回顶部