1.下载第三方库源码 (例如:jpeg解码库)
Independent JPEG Group
即下载jpeg的源码到电脑的每个文件中(要记得是下载到哪里了)然后登陆ubantu中建立一个文件将源码cp到该文件中,然后第一步解压源码,第二步创建一个安装目录jpeglib配置源码,为的就是得到.o文件和动态库和静态库,第三步,解压配置好的库文件到家目录,会得到官方例子代码和头文件。最后就是编译,此过程会遇到各种问题:分别是,start文件,即没有main.c文件,我们可以进入目录创建一个main.c 文件即可解决,第二个是example.c中的375行put_scanline_someeplace()函数先屏蔽了,第三个是编译时要链接jpeg的库(记得他的库放在哪的就链接到哪就行,-I./include -L/home/gec/jpeglib/lib -ljpeg),第四个就是没有定义长宽,色深啊这些有关的也屏蔽掉在读取函数中,第五个就是上传到开发板上不能编译怎么办?把所有的动态库文件上传到开发板的/bin目录下就可以解决了,下面是详细的步骤
2.解压库源码&配置源码
1.解压源码
mkdir ~/jpegsrc
tar -xvf jpegsrc.v9d.tar.gz -C ~/jpegsrc/
2.配置源码
cd ~/jpegsrc/jpeg-9d/ #1.进入源码目录
./configure --help #2.查看配置帮助文档
配置参数说明👇
........
--prefix=PREFIX install architecture-independent files in PREFIX
[/usr/local] 安装库的路径
--host=HOST cross-compile to build programs to run on HOST [BUILD]
............
mkdir /home/gec/jpeglib #3.0创建一个安装目录
echo 'export PATH=$PATH:/usr/local/arm/5.4.0/usr/bin' >> ~/.bashrc #3.1配置PATH环境变量
source ~/.bashrc #加载配置文件
./configure --prefix=/home/gec/jpeglib --host=arm-linux #3.2⭐重点:开始配置
make #4.编译 👉 调用makefile 文件生成 .o 和动态库与静态库
make install #5.安装
3.jpeg库的使用 (✔️)怎么使用该库来显示jpeg图片到开发板上
1.解压配置好的库文件到家目录
tar -xvf jpeglib.tar.gz -C /home/gec
2.把调用官方的示例代码,进行解码
gec@PC-20240429TQJF:官方解码例子$ ls
example.c (官方解码例子) include (头文件) main.c (主函数)
3.编译官方示例代码 👉编译过程中出现的问题自己解决一下
gec@PC-20240429TQJF:官方解码例子$ arm-linux-gcc main.c example.c -I./include -L/home/gec/jpeglib/lib -ljpeg
4.下载可执行文件到开发板中运行
[root@GEC6818 /]#./a.out
./a.out: error while loading shared libraries: libjpeg.so.9 ❌出现错误, 解决方法:把jpeg库下载到开发板的 /lib 目录
4.jpeg 解码源码分析
//解码结构体
struct jpeg_decompress_struct {
JDIMENSION image_width; /* 图片宽度*/
JDIMENSION image_height; /* 图片高度*/
int num_components; /* # of color components in JPEG image 色深*/
}
//1.读取jpeg头数据
(void)jpeg_read_header(&cinfo, TRUE); // 读取jpeg文件头
// 打印图片的信息
printf("%d %d %d\n", cinfo.image_width, cinfo.image_height, cinfo.num_components);
5、jpeg 转 rgb 算法设计
主要代码:
char rgb[480][800 * 3] = {0};
int y = 0; // 当前行
// 一行一行的解码
while (cinfo.output_scanline < cinfo.output_height)
{
printf("当前解码行 %d : 总行数 %d\n", cinfo.output_scanline, cinfo.output_height);
(void)jpeg_read_scanlines(&cinfo, buffer, 1); // 解码一行jpeg数据
for (int x = 0; x < 800 * 3; x++)
{
rgb[y][x] = buffer[0][x];
}
y++; // 行数增加
}
// 把RGB转换为ARGB
char argb[480][800 * 4];
for (int y = 0; y < 480; y++)
{
for (int x = 0; x < 800; x++)
{
argb[y][2 + x * 4] = rgb[y][0 + x * 3]; // R
argb[y][1 + x * 4] = rgb[y][1 + x * 3]; // G
argb[y][0 + x * 4] = rgb[y][2 + x * 3]; // B
argb[y][3 + x * 4] = 0; // A
}
}
至此,希望看完这篇文章的你有所收获,我是Bardb,译音八分贝,道友,下期见!