linux图像显示(一)framebuffer操作
linux图像显示(二)bmp图片
linux图像显示(三)使用libjpg处理jpg图片
linux图像显示(四)使用libpng处理png图片
linux图像显示(五)使用freetype处理矢量字体
由于libpng的的编译需要依赖zlib,所以我们需要下载libpng和zlib
下载地址:ftp://ftp-osl.osuosl.org/pub/libpng/src/
将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
先说明一下三个符号 -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;
}