浅谈一下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就行了。

原创粉丝点击