浅谈一下pnglib的使用和移植(基于anyka平台)
来源:互联网 发布:linux uboot 启动详解 编辑:程序博客网 时间:2024/06/09 19:11
pnglib库很好的支持了C语言模式下对png操作的支持,而且使用过程也比较简单,移植过程遇到的问题也不是很大。在这里简单的谈一下pnglib库的使用和移植,如果有错误的地方希望各位挨踢人士指出。
现在最新的pnglib库的版本是1.5.7,可以从官网下载http://www.libpng.org/pub/png/libpng.html。pnglib库对zlib有依赖,所以在移植pnglib的同时,如果你的平台上面没有zlib,那也必须把zlib一块移植了。我在移植的过程中使用的是pnglib1.5.7和zlib1.2.5 ,这2个版本的库在移植的时候并没有出现不兼容的问题。我使用的平台是安凯的平台,主芯片是anyka3660,主要面向教育方向的消费类产品。考虑到大部分人不是用anyka这个比较不熟悉的平台,我特意在VC6.0上做了移植和测试,测试的结果也是正常可以使用的。而且在VC6.0上移植起来也更为方便。
在这里先讲一下pnglib的使用,再根据使用过程的具体问题再说说pnglib的移植应该注意的问题。先上一段测试代码先。我会在csdn上将整个测试的VC6.0工程上传。
int m_width = 0, m_height = 0, color_type = 0;int size = 0, pos = 0, i = 0, j = 0;unsigned char* bgra = NULL;png_structp png_ptr = NULL;png_infop info_ptr = NULL;png_typep *row_pointers;FILE *fp;file = fopen(pngname, "rb");png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING,0, 0, 0);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);m_wdith = png_get_image_width(png_ptr,info_ptr);m_height= png_get_image_height(png_ptr,info_ptr);color_type = png_get_color_type(png_ptr,info_ptr);size = m_height*m_width*4;bgra = (unsigned char*)malloc(size);row_pointer = png_gets_rows(png_ptr, info_ptr);//取到的数据就是带alpha通道的bgra数据png_destroy_read_struct(&png_ptr, &info_ptr, 0);fclose(file);
上面的代码介绍了解码png格式的方法。先创建2个重要的结构体,然后通过设置一系列参数,初始化结构体,最后通过png_gets_rows函数得到了最终的带alpha通道的数据。通过上面的pnglib API接口传参和功能,我们知道需要用到文件指针FILE* fp
png_init_io(png_ptr, file);以及创建结构体png_ptr和info_ptr。
png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING,0, 0, 0);
info_ptr = png_create_info_struct(png_ptr);
销毁结构体调用APIpng_destroy_read_struct(&png_ptr, &info_ptr, 0); 通过上面的分析我们知道,在移植pnglib库的时候,目标平台需要支持标准的fopen、fclose、malloc、free。如果目标平台的文件系统支持这些操作,恭喜你,你需要做的只是修改Makefile,然后编译(注意pnglib和zlib里面有包含无用的例子代码,移植过程最好删除)。如果,目标平台文件系统不支持上述API,则需要对pnglib的代码做一些适当的修改。修改的地方不是很多,我移植过程只修改了pngconf.h、pngmem.c、pngrio.c 这3个代码文件。
下面是针对anyka 3660 sdk移植pnglib的步骤:
1.在pngconf.h中重新定义文件指针类型,我将png_FILE_p这个类型定义成目标平台支持的文件句柄typedef T_hFILE png_FILE_p;
pnglib的原始定义为typedef FILE *png_FILE_p;
2.在pngmem.c中,修改png_create_struct(int type)函数,使得pnglib摆脱对malloc,free的依赖,支持anyka的Fwl_Malloc和Fwl_Free接口。我将下面的代码
#if defined(_MSC_VER) && defined(MAXSEG_64K)
struct_ptr = (png_voidp)halloc(size,1);
#else
struct_ptr = (pngvoidp)malloc(size);
#endif
改成如下:
#if defined(_MSC_VER) && defined(MAXSEG_64K)
struct_ptr = (png_voidp)halloc(size,1);
#else
struct_ptr = Fwl_Malloc(size);
#endif
同样的方法在png_destroy_struct函数内:
#if defined(_MSC_VER) && defined(MAXSEG_64K)
hfree(struct_ptr);
#else
free(struct_ptr);
#endif
修改成如下:
#if defined(_MSC_VER) && defined(MAXSEG_64K)
hfree(struct_ptr);
#else
Fwl_Free(struct_ptr);
#endif
同样在该文件中修改png_malloc_default(png_structp pnt_ptr, png_uint_32 size)和png_free_default(png_structp pnt_ptr, png_voidp ptr).到此,pnglib就能支持对应的anyka平台上的内存分配和销毁接口了。
3.修改pngrio.c,使得pnglib支持anyka文件系统的读文件接口Fwl_FileRead.
只需要将pngrio.c中fread修改成Fwl_FileRead,则移植就能成功。详细的就不说明了。至此,代码修改完成,只需要修改对应的Makefile就行了。
- 浅谈一下pnglib的使用和移植(基于anyka平台)
- Anyka云平台调用api
- 基于qq2440开发平台的uboot移植(1)
- 基于MTK平台的camera 移植总结
- 基于FS4412平台的Linux系统移植
- 基于MSM平台的振动器驱动移植
- 基于Android平台的x264的移植与应用(一):移植篇
- 基于Android平台的x264的移植与应用(一):移植篇
- 基于Android平台的x264的移植与应用(一):移植篇
- 基于Android平台的x264的移植与应用(一):移植篇
- 4.使用pnglib读写png图片
- 基于S3C2410平台的Linux 2.6.14内核+平台驱动的移植指南(最终版)
- 基于S3C2410平台的Linux 2.6.14内核+平台驱动的移植指南(最终版)
- Android平台下OpenCV移植与使用---基于C/C++
- 浅谈一下对cocos2d-x中九宫格精灵的简单理解和使用
- Linux平台基于S3C2440的MPlayer的移植
- FFmpeg的Android平台移植及使用
- 基于imx6q平台移植ffmpeg
- Subversion 错误信息一览表
- jsp 关闭页面时提示
- 了解 Boost Filesystem Library
- Linux下JAVA开发环境的搭建(JDK+Eclipse+Tomcat详细)
- iphone-common-codes-ccteam源代码 CCFileUtil.m
- 浅谈一下pnglib的使用和移植(基于anyka平台)
- iphone-common-codes-ccteam源代码 CCFoundation.h
- LINUX系统双网卡共享上网
- System.ArgumentOutOfRangeException: 年、月和日参数描述无法表示的 DateTime。
- 【清华大学】2012寒假全国高校物联网专业师资培训
- GAMS将har数据转换为gdx数据和Access数据过程中的异步问题
- 2012年开发者该做的11件事(转)
- 可执行jar的classpath 设置
- 行内元素 和 块状元素