设为首页 加入收藏

TOP

教你如何使用libpng显示PNG图片
2014-11-24 02:56:06 来源: 作者: 【 】 浏览:0
Tags:如何 使用 libpng 显示 PNG 图片

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[i][j + 2]; // blue
bgra[pos++] = row_pointers[i][j + 1]; // green
bgra[pos++] = row_pointers[i][j]; // red
bgra[pos++] = row_pointers[i][j + 3]; // alpha
}
}


// 好了,你可以用这个数据作任何的事情了。。。把它显示出来或者打印出来都行。


png_destroy_read_struct(&png_ptr, &info_ptr, 0);


fclose(file);


return;


}


推荐阅读:


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇利用libpng中的函数读写PNG文件 下一篇libpng的PNG图片读取

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: