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;
}
分享到:
相关推荐
3、设置错误返回点 上文libjpeg解码jpeg图片中提到用setjmp/longjmp函数来处理异常 4、设置libpng的数据源 我在上文《图
本文代码利用libpng库解码读取png图片,获取图片像素的颜色索引值,并将结果保存在opencv的Mat数据容器中。
MFC利用libpng源码库显示PNG图片
GL2libpng-android-显示PNG图片.rar GL2libpng-android-显示PNG图片.rar
png+libpng.lib+libpng16.dll+zlib.lib四个C语言使用libPNG开发需要用到的 一:libpng库的编译 环境:windows10 + VS2013 需要下载:libpng, zlib两个库 下载地址: libpng:...
首先下载两个库, 一个是 libpng , 另一个则是 zlib 库, zlib 库是一套用于压缩数据的库, libpng 借助了该库作为压缩引擎, 也就是说, libpng 依赖于 zlib 库。
图片资源中有一个不是 png 格式图片, 这个png 格式并不是只指 尾缀名 为 ".png" 的图片。 可通过 java代码 检查 是否为png 格式。
在Windows平台上使用libpng解码PNG图片,而后用OpenGLES进行显示,有透明度
解决PNG显示的问题只需要两个步骤移植libpng到开发板上编写代码解析PNG图片,并写入fb0移植libpng因为我已经移植过了,如果你有兴趣当然可以自己移植
在vc6中用libpng 库来显示png图片
A description on how to use and modify libpng libpng version 1.2.5 - October 3, 2002
报错libpng warning: iCCP: known incorrect sRGB profile的问题
资源里面是标准的png源码,其中包含全部代码和说明文档
libpng 用于处理 png 格式的图片, 是一套比较完善的 png 图片处理库, 免费、开源, 因此受到了很高的好评。当需要利用qrencode生成二维码的时候,这个版本可以和Zlib-1.2.8,qrencode-3.4.4版本,共同作用生成想要的...
VS2015编译的png库的64位库,版本是1.6.37。libpng是一款C语言编写的比较底层的读写PNG文件的跨平台的库。借助它,你可以轻松读写PNG文件的每...因此,通过使用libpng你就能直接使用现成的函数、程序来读写PNG文件了。
本资源用于png贴图的使用,里面直接包含了dll和lib等相关文件,不用重新生成dll文件
不使用libpng,较好解决OpenGL中使用png图标的方法
arm下图片显示,jpeg,bmp,png三种图片 libjpeg 解析jpeg libpng 解析png 可以通过framebuffer显示
一些桌面和手机游戏中的一些动画效果需要使用很多帧图像,通过快速轮动播放来实现,少则几帧,多则几十帧,为了方便管理图片和减少图片文件总的大小,往往需要把这些帧的图像合并到一个文件中-----即把N个大小和格式...
libpng是一款C语言编写的比较底层的读写PNG文件的跨平台的库。借助它,你可以轻松读写PNG文件的每一行像素。 因为PNG文件是经过压缩而且格式...因此,通过使用libpng你就能直接使用现成的函数、程序来读写PNG文件了。