bmp图片解码

#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;
}


  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值