linux图像显示(四)使用libpng处理png图片

linux图像显示

linux图像显示(一)framebuffer操作

linux图像显示(二)bmp图片

linux图像显示(三)使用libjpg处理jpg图片

linux图像显示(四)使用libpng处理png图片

linux图像显示(五)使用freetype处理矢量字体

 

移植libpng

1、下载

由于libpng的的编译需要依赖zlib,所以我们需要下载libpng和zlib

下载地址:ftp://ftp-osl.osuosl.org/pub/libpng/src/

2、移植

将zlib和libpng传到ubuntu中,解压

(1)我们需要先移植zlib

cd到解压出来的zlib目录下

①导出编译器,注意这个编译器必须在你当前环境下能找到,请自行修改

# export CC=arm-linux-gcc

②配置

./configure -shared --prefix=/path

其中path是你自定义的路径,生成的库和头文件将保存到此目录下

③编译并安装

make
make install

这是会在path路径的llib和include目录下发现生成了zlib相关的文件

(2)移植libpng

进入libpng目录下

①导出zlib生成文件所在的目录到环境变量

export LDFLAGS="-L/path/lib"
export CFLAGS="-I/path/include"
export CPPFLAGS="-I/path/include"

②配置

./configure --host=arm-linux --enable-shared --enable-static --prefix=/path

请注意自己修改path路径

③编译并安装

make
make install

3、添加到我们的项目中

先说明一下三个符号 -I -L -l

-I 表示添加头文件路径

-L 表示添加链接库路径

-l 表示添加库

在我们项目的Makefile中添加

-I+头文件的路径
CFLAGS += -I/opt/mlib/include

-L+库的路径
LDFLAGS += -L/opt/mlib/lib
-l+库的名字
LDFLAGS += -lpng -lz

此外还需要将动态链接库.so拷贝到开发板的根文件系统中

①可以拷贝/lib或者/usr/lib这两个系统可以自动查找的地方

②也可以添加添加到自定义的路径,然后导出路径到环境变量中(推荐这种做法)

导出到环境变量:

# export LD_LIBRARY_PATH=/usr/m_lib:$LD_LIBRARY_PATH

查看是否导出成功

echo $LD_LIBRARY_PATH

示例代码

void png_read(char *file_path)
{
    png_structp png_ptr;
    png_infop info_ptr;
    int color_type = 0; 
    int image_size = 0;
    int image_width, image_height;
	
    FILE *p_fp;

    if ((p_fp = fopen(file_path, "rb")) == NULL)
    {
        fprintf(stderr, "%s open fail!!!\n", file_path);
        return -1;
    }

    /* 创建一个png_structp结构体,如果不想自定义错误处理,后3个参数可以传NULL */
    png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);	
    if (png_ptr == NULL)
    {
        fclose(p_fp);
        return -1;
    }

	/* 创建一个info_ptr,必须的 */	
    info_ptr = png_create_info_struct(png_ptr);
    
    if (info_ptr == NULL)
    {
        fclose(p_fp);
        png_destroy_read_struct(&png_ptr, NULL, NULL);
        return -1;
    }

    /* 如果上面png_create_read_struct没有自定义错误处理,这里是必须的 */
    if (setjmp(png_jmpbuf(png_ptr)))
    {
        png_destroy_read_struct(&png_ptr, &info_ptr, NULL);
        fclose(p_fp);

        return -1;
    }

    /* 初始化文件IO */
	png_init_io(png_ptr, p_fp);

    /* 
     * 函数功能:读取png图片信息 
     * 说明:可以参数3来改变不同的读取方式,这里只读取RGB,抛弃了ALPHA
     */
    png_read_png(png_ptr, info_ptr, PNG_TRANSFORM_EXPAND | PNG_TRANSFORM_STRIP_ALPHA, NULL);

	if ((png_ptr != NULL) && (info_ptr != NULL))
	{
		/* 获取图像的宽高 */
		image_width = png_get_image_width(png_ptr, info_ptr);       
		image_height = png_get_image_height(png_ptr, info_ptr); 
		printf("width:%d,height:%d\n", image_width, image_height);

        /* 获取图像颜色类型 */
	    color_type = png_get_color_type(png_ptr, info_ptr); 
        printf("color type:%d\n", color_type);

    }

    /* 获取所有的图像数据 */
    png_bytep *row_pointers; /* 指针数组,数组中的每一个指针都指向一行图像数据 */
    row_pointers = png_get_rows(png_ptr, info_ptr);
 
    int i, j;
    int pos = 0;

	/* RGB格式 */
    if(PNG_COLOR_TYPE_RGB == color_type)
    {
        /* 图像数据的大小 */
        image_size = image_width * image_height * 3;   
        p_image_buf = malloc(image_size);

        for(i = 0; i < image_height; i++)
        {
            for(j = 0; j < (image_width * 3); j += 3)
            {
                *(p_image + pos++) = row_pointers[i][j + 0];
                *(p_image + pos++) = row_pointers[i][j + 1];
                *(p_image + pos++) = row_pointers[i][j + 2];
               
            }
        }

    }   

    /* 清理图像,释放内存 */
    png_destroy_read_struct(&png_ptr, &info_ptr, 0);
    
    fclose(p_fp);    
    
    return 0;
}

 

你可能感兴趣的:(linux图像显示(四)使用libpng处理png图片)