【vc++精品源码栏目提醒】:网学会员在vc++精品源码频道为大家收集整理了“【精品】使用libpng读取PNG图片像素数据 - 其它资料“提供大家参考,希望对大家有所帮助!
使用 libpng 读取 PNG 图片像素数据libpng 是一套免费的、公开源代码的程序库,支持对 PNG 图形文件的创建、读写等操作。
可以到 www.libpng.org 上下载源代码。
libpng 使用 zlib 程序库作为压缩引擎,zlib 也是著名的gzip GNU zip 所采用的压缩引擎。
zlib 是通用的压缩库,提供了一套 in-memory 压缩和解压函数,并能检测解压出来的数据的完整性integrity。
zlib 也支持读写 gzip .gz 格式的文件这些都是免费和公开的哦。
在下载了 pbglib,并且要下载 zlib,如何才能加到代码中呢?以 VC6.为例来说明。
其他 CBuild 等编译器相信也一样的。
比如我们从网上下载了一个 lpng1210.zip和 zlib-1.2.3.tar.tar。
首先把他们解压。
在 lpng 的目录中寻找 projects/visualc6/libpng.dsw。
并在 zlib 中寻找 zlib-1.2.3/projects/visualc6 /zlib.dsw。
用 vc 打开 libpng 工程文件,把 zlib 的工程文件也添加进去。
设置好在 setting 中设置好的 zlib.lib 和 pbg.lib 的输出路径,以及 include路径(这个简单方法相信大家都明白吧)。
运行后,就生成了两个静态库了。
lib 做好以后,就可以将 lib 加到我们要做的工程中去。
在 link 中设置好,并将 png.h 和 zlib.h 都加进去。
这样就可以正式的使用 libpng 了!下面到重点内容了。
如何用 pnglib 实现对文件的读写? 现在让我们来试着写一段代码来读取PNG 像素数据from File or Stream,并把读取的数据存储到一个数组 rgba 中用来生成OpenGl 纹理typedef struct u8 pixelData int imageWidth int imageHeightImageInfotypedef struct u8 data int size int offsetImageSource//----------------------------------------------------------------------------------------------------------------static void pngReaderCallbackpng_structp png_ptr png_bytep data png_size_t length ImageSource isource ImageSourcepng_get_io_ptrpng_ptr ifisource-gtoffset length lt isource-gtsize memcpydata isource-gtdata isource-gtoffset length isource-gtoffset length else png_errorpng_ptrquotpngReaderCallback failedquot //----------------------------------------------------------------------------------------------------------------ImageInfo decodePNGFromStreamconst u8 pixelData const u32amp dataSize png_structp png_ptr png_infop info_ptr int width height rowBytes png_byte color_type //可以是PNG_COLOR_TYPE_RGBPNG_COLOR_TYPE_PALETTE.......等 png_byte bit_depth png_colorp palette png_ptr png_create_read_structPNG_LIBPNG_VER_STRING NULLNULLNULL if png_ptr png_destroy_read_structamppng_ptr ampinfo_ptr png_infopp_NULL TFC_DEBUGquotReadPngFile: Failed to create png_ptrquot info_ptr png_create_info_structpng_ptr if info_ptr png_destroy_read_structamppng_ptr ampinfo_ptr png_infopp_NULL TFC_DEBUGquotReadPngFile: Failed to create info_ptrquot if setjmppng_jmpbufpng_ptr png_destroy_read_structamppng_ptr ampinfo_ptr png_infopp_NULL TFC_DEBUGquotReadPngFile: Failed to read the PNG filequot ImageSource imgsource imgsource.data u8pixelData imgsource.size dataSize imgsource.offset 0 //define our own callback function for I/O instead of reading from a file png_set_read_fnpng_ptrampimgsource pngReaderCallback / The low-level read interface in libpnghttp://www.libpng.org/pub/png/libpng-1.2.5-manual.html / png_read_infopng_ptr info_ptr width info_ptr-gtwidth height info_ptr-gtheight color_type info_ptr-gtcolor_type bit_depth info_ptr-gtbit_depth rowBytes info_ptr-gtrowbytes palette inf