#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <sys/ioctl.h>
#include <linux/fb.h>
void drw_poin(unsigned int *lcdfd,int x,int y,int color)
{
*(lcdfd+x+y*800) = color;
}
int show_bmp24(unsigned int *lcdfd,char *path,int x,int y)
{
int i,j;
if(x>=480)
x = 480;
else if(x < 0)
x = 0;
if(y>=800)
y = 800;
else if(y < 0)
y = 0;
//把LCD指针偏移到要显示的坐标位置中
lcdfd= lcdfd+x+y*800;
//获取图片数据
int bmpfd=open(path,O_RDWR);
if(bmpfd<0)
{
perror("open bmp fail:");
return -1;
}
//获取图片信息
int length,weight;
lseek(bmpfd,18,SEEK_SET);
read(bmpfd,&weight,sizeof(int));
read(bmpfd,&length,sizeof(int));
printf("weight = %d,length = %d\n",weight,length);
//读取图片
//int buf32[480][800]={0};
char buf24[weight*length*3]; //注意变长数组在没有确定值前不能初始化
//去除文件头信息
lseek(bmpfd,54,SEEK_SET);
read(bmpfd,buf24,sizeof(buf24));
//把24位图,转换成32位图
char red;
char green;
char blue;
char ar;
//使用p指向图片数据
char *p=buf24;
for(i=x;i<weight;i++)
{
for(j=y;j<length;j++)
{
blue=*p++;
green=*p++;
red = *p++;
ar = 0 ;
int color = ar << 24 | red<<16 | green<<8|blue;
drw_poin(lcdfd,j,weight-1-i,color);
}
}
//关闭设备
close(bmpfd);
}
int main(int argv,char **argc)
{
//打开LCD设备
int fd=open("/dev/fb0",O_RDWR);//lcd设备文件路径
if(fd<0)
{
perror("lcd:");
}
//获取LCD屏幕属性
struct fb_var_screeninfo lcdmsg;
int ret=ioctl(fd,FBIOGET_VSCREENINFO,&lcdmsg);
if(ret==0)
{
printf("lcd x=%d,y=%d,bit=%d\n",lcdmsg.xres,lcdmsg.yres,lcdmsg.bits_per_pixel);
}
//获取字节的大小
int c= lcdmsg.bits_per_pixel/8;
//对LCD设备空间进行映射
unsigned int *lcd=mmap(NULL,lcdmsg.xres*lcdmsg.yres*c,PROT_READ|PROT_WRITE, MAP_SHARED,fd,0);
if(*(int *)lcd==-1)
{
perror("mmap lcd fail:");
}
show_bmp24(lcd,argc[1],0,0);
close(fd);
return 0;
}
bmp图片解码
最新推荐文章于 2024-08-11 16:28:45 发布