编程思路:
1、打开bmp图片获得fd文件描述符(open()函数)
2、偏移信息头54字节,lseek()函数
3、读取bmp图片BGR(与RGB位置相反)信息
4、关闭文件fd
5、打开屏幕设备文件/dev/fb0(open(),读写操作)
6、映射一块内存地址
7、BGR转ARGB,3转4操作,上下颠倒操作
8、将ARGB显示数据写到fb0 注意:ubantu字符界面可视分辨率800600,实际分辨率不是800600,要进行偏移
9、关闭屏幕
图片解释:
实现代码:
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/mman.h>
int main(int argv,char *argc[])
{
unsigned char bmp_buf[480][800*3]={
0};
int lcd_buf[480][800]={
0};
/* 1、open bmp to get fd. */
int bmp_fd = open(argc[1],O_RDONLY);
/* 2、jump bmp head info size of 54 Bytes. */
lseek(bmp_fd,54,SEEK_SET);
/* 3、read bmp RGB info to bmp_buf and print read_numBytes. */
read(bmp_fd,bmp_buf,800*480*3);
/* 4、close bmp_fd */
close(bmp_fd);
/* 5、open screen file. */
int fb0_fd = open("/dev/fb0",O_RDWR);
// 6、映射
unsigned int *p = mmap(NULL, //映射的首地址
1176*885*4, //映射的空间大小,也就是开发板显存
PROT_READ|PROT_WRITE, //允许进行读写操作
MAP_SHARED, //内存共享
fb0_fd, //打开屏幕设备返回的文件描述符
0); //偏移地址
if (p == MAP_FAILED) {
printf("mmap failed!\n");
return -3;
}
/* 7、BGR转ARGB,3转4操作,上下颠倒操作 */
for(int Bmp_H=0;Bmp_H<480;Bmp_H++)
for (int Bmp_W = 0; Bmp_W<800; Bmp_W++)
lcd_buf[479-Bmp_H][Bmp_W]=(0x00<<24) | (bmp_buf[Bmp_H][Bmp_W*3]) | (bmp_buf[Bmp_H][Bmp_W*3+1]<<8) | (bmp_buf[Bmp_H][Bmp_W*3+2]<<16);
//* 8、write ARGB info to fb0_fd.*/
for(int x=0;x<480;x++)
for(int y=0;y<800;y++)
*(p+x*1176+y) = lcd_buf[x][y]; //把最后一行放到第一行
// 9、解除映射并关闭屏幕文件
munmap(p,800*480*4);
/*close fd. */
close(fb0_fd);
}
ctrl+alt+F1,输入用户名加密码(不显示)进入字符界面,输入以下执行命令:
执行命令:sudo ./程序名 路径
例子:sudo ./shoubmp 1.bmp
运行结果:
————————————————