笔记整理—linux驱动开发部分(15)BMP图片显示
图片显示的本章就是二进制文件,文件不是二进制文件就是文本文件,文本文件也可以以二进制的方式打开。
BMP图片的特征,就是未被压缩的元素位图格式。BMP文件组成为:头信息(图片相关信息)+有效信息(图片数据)。BMP图片识别方式为在头信息中的标识(0x42 4D 开头)。
图片打开方式:①打开文件;②判断图片格式;③解析头信息得到详细信息;④根据有效信息去核实位置用合适方法提取真正有效信息;⑤将得到的有效数据放入fb中显示。
*((unsigned int *)(buf+0x12))
read(fd,&fHeader,sizeof(fHeader));
fHeader是头信息结构体,按文件信息排列,顺序去读头信息,顺序存入。
for(i=0;i<sizeof(fHeader);i++)
printf("%x",*((unsigned char*) &fHeader+i));
上面的代码用于逐位访问结构体。
typedef struct
{
unsigned short
unsigned long
unsigned short
unsigned short
unsigned long
}__attribute__((packed,aligned(1)));//1字节对齐
由于内存对齐会将2字节的short补2字节,会在对齐后产生问题。
struct C/BitMapFileHeader Header __attribute__((aligned(1)));
上面这是申请时的对齐方法。
struct FileHeader {
unsigned char a;
unsigned char b;
unsigned char c;
unsigned char d;
}__attribute__((packed,aligned(1)));
int main() {
struct FileHeader fHeader = {0x12, 0x34, 0x56, 0x78}; // 初始化数据
int i = 2;
printf("%x\n", *((unsigned char*) &fHeader + i));
return 0;
}
综合一下举个例子,如上。
lseek(fb,fHeader,bfoffBits(图片有效信息开始位),SEEK_SET);
read(fd,bmp_buf(数组),len(是Width*Height/3));
JPG的全名是JPEG,其有效信息位与图像信息无点对点的关系,要通过运算才能实现显示,反推回到位图数据,再放入framebuffer(解码)。
编码方式对应解码方式(压缩度、算法复杂度、清晰度、时间)。软件编解码方法,代码实现属性运算;硬件编解码方法,代码以硬件运算不用cpu运算且速度更快(SOC Multimedia的相关模块)。
JPG图片是行刷新,PNG图片是轮廓刷新(越来越清晰)。
PS:动态库是程序运行时使用的,所以应再程序运行出进行移植。头文件是在编译时使用,所以应该在编译前进行处理移植。静态库是程序编译时使用的。-I是编译选项/预处理选项(CFLAGE/CPPFLAGE),-l是链接选项用于指定link额外的库(xxx.so)(LDFLAGE)(-xxx名字一般为库名),-L链接选项用于执行xxx.so的位置,可不用-l直接-L。动态链接库一般放在三个地方①./lib;②/usr/lib;③任意指定目录,要自己去指定PATH。
linux文件处理非缓冲方法:利用read/write等API(linux);缓冲方法利用fread/fwrite等函数(c库)。读文件就用带缓冲的接口;读设备就用API。
libjpeg以行做数据转换单位,以行为一个数组RGB排列(一次解码一行)。
0xffd8是JPEG头文件信息——JPG图片判别
0xffd9是JPEG尾信息——是jpg图片结束的标志
32位色ARGB,A为透明度alpha。0~255,0表示全透明,255表示不透明。
PNG图片的头表示为89 50 4E 47 0D 0A 1A 0A.