Linux系统下,RAM开发板图片的显示:

    基础是LCD点的显示
    图片不管是什么格式,都是保存了每一个像素点的信息,只是保存的方法不一样,显示图片其实就是把图片中每一个点的颜色信息拿出来,放到开发板相应的位置。
    
    bmp图片 详细的讲
    bmp是一种常见的高清的图片存储格式
    bit map picture 位图
    原理:将图片的每一个像素点的每一个位按照一定的顺序存储到文件中。
    ====》BMP图片是没有被压缩的
          PNG 和BMP非常的类似
    位深:每一个像素点占用的bit数量
        24位:一个像素点占用3 byte
            RGB
        32位:一个像素点占用4 byte 
            ARGB
    自己制作一张合适的BMP:
        一定不是把后缀名改为BMP
        600*450 = ?
        600*450*3 = 810,000?
                    810,054
    多出的54个字节:在文件的头部使用54个字节保存图片本身的信息,如宽度,高度.....
        599*449*3+54 = 806907
                       808,254
    
    windows规定:BMP每一行的大小必须是4的倍数,不是4的倍数,则填充为4的倍数。
    
    写代码,显示一张基础的BMP图片
    
    位运算,一个位一个位的运算
    & | ~ << >>
    &:位与,都为1才为1
    10100101
    00110011
   &00100001
    | 都为0才为0
    10100101
    00110011
   |10110111
   
   << 整体向左移动,右边补0
   10100101 << 3
   10100101000
   如果把上面的值放到一个char的数据中
   丢弃高位
   00101000
    
    BMP颜色的排列为 BGR
    BRG ====》 ARGB
    
    注意:
        BMP存储是从最后一行开始
        从下至上,从左至右
    jpeg图片,被压缩过的,要使用专业的工具解压。 
    
    实践:
        
       利用BMP文件的前面54个字节,写一个函数,只要指定名字和起始位置就可以正确的显示
        
     Segmentation fault段错误,内存的非法访问不能随便访问我们不能访问的地址
        大端模式:高字节存放在低地址
        小端模式:高字节存放在高地址

        

#include 
#include 
#include 
#include 
#include 

#include 

int * plcd;
//全局变量,代表映射后的首地址

/*
函数的功能:在指定的点显示一个指定的颜色
函数参数:
@x:你指定的点的横坐标
@y:你指定的点的纵坐标
@color:你指定的颜色
函数的返回值:无*/

void lcd_draw_point(int x,int y,int color)
{
	if(x>=800 || y>= 480)
	{
		printf("you point out the lcd\n");
		return ;//仅代表函数结束
	}
	*(plcd+800*y+x) = color;
}

//清屏
void lcd_clear(int color)
{
	int x,y;
	for(y=0;y<480;y++)
	{
		for(x=0;x<800;x++)
		{
			lcd_draw_point(x,y,color);
		}
	}
}

void lcd_draw_bmp(char *name,int x0,int y0){

//把像素点数据合成颜色
    int fd = open("/dev/fb0",O_RDWR);
	if(-1 == fd)
	{
		printf("open lcd error\n");

	}


	//映射内存
	plcd = mmap(NULL,800*480*4, PROT_WRITE | PROT_READ,MAP_SHARED,fd,0);
	if(plcd == MAP_FAILED)
	{
		printf("map error\n");

	}
    int fd_bmp = open(name,O_RDWR);
	if(-1 == fd_bmp)
	{
		printf("open bmp error\n");

	//解映射
	munmap(plcd,800*480*4);
	//关闭
	close(fd);

	}
	
	int w,h;
	
	char buf[800*480*3+54];
	read(fd_bmp,buf,800*480*3+54);
	close(fd_bmp);
	lcd_clear(0x00ffffff);
	w=buf[18]|buf[19]<<8|buf[20]<<16|buf[21]<<24;
	h=buf[22]|buf[23]<<8|buf[24]<<16|buf[25]<<24;
	//把像素点数据合成颜色
	char b,g,r;
	int color;
	int x,y;
	int i= 0;
	w=w+3*w%4;
	for(y=h+y0-1;y>=y0;y--)
	{
		for(x=x0;x

 

你可能感兴趣的:(Linux系统下,RAM开发板图片的显示:)