文件IO練習題 設計程式,實現在LCD上任意位置顯示一張任意大小的色深為24bit的bmp圖片,要求圖像不失真可以在開發板的LCD上顯示。 代碼: /*************************************************************************** ...
文件IO練習題
設計程式,實現在LCD上任意位置顯示一張任意大小的色深為24bit的bmp圖片,要求圖像不失真可以在開發板的LCD上顯示。
代碼:
/*****************************************************************************************************************
*
* file name : ShowBmp.c
* author : [email protected]
* data : 2024/05/13
* function : 實現在LCD上任意位置顯示一張任意大小的色深為24bit的bmp圖片,不要越界
* note : None
*
* CopyRight (c) 2024 [email protected] All Right Reseverd
*
* ****************************************************************************************************************/
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/mman.h>
#pragma pack(1)
// 定義BMP文件頭部結構
typedef struct{
unsigned short bfType; //標識該文件為bmp文件,判斷文件是否為bmp文件,即用該值與"0x4d42"比較是否相等即可,0x4d42 = 19778
unsigned int bfSize; //點陣圖文件大小,包括這14個位元組。
unsigned short bfReserved1; //預保留位,暫不用。
unsigned short bfReserved2; //預保留位,暫不用。
unsigned int bfOffBits; //圖像數據區的起始位置
}BITMAPFILEHEADER; //文件頭
typedef struct{
unsigned int biSize; //本結構的長度,為40個位元組。
int biWidth; //寬度
int biHeight; //高度
unsigned short biPlanes; //目標設備的級別,必須是1。
unsigned short biBitCount; //色深,每個像素所占的位數(bit),其值必須為1(黑白圖像)、4(16色圖)、8(256色)、24(真彩色圖),新的BMP格式支持32位色。
unsigned int biCompression; //壓縮方式,有效的值為BI_RGB(未經壓縮)、BI_RLE8、BI_RLE4、BI_BITFILEDS(均為Windows定義常量)。
unsigned int biSizeImage; //圖像區數據大小,即實際的點陣圖數據占用的位元組數
int biXPelsPerMeter; //水平解析度,像素每米
int biYPelsPerMeter; //垂直解析度,單位是像素/米
unsigned int biClrUsed; //點陣圖實際用到的顏色數,如果該值為零,則用到的顏色數為2的biBitCount次冪。
unsigned int biClrImportant; //點陣圖顯示過程,重要的顏色數;0--所有都重要
}BITMAPINFOHEADER;
#pragma pack()
void ShowBmp(char *name,int x1,int y1,int *lcd_mp)
{
//1.打開待顯示的BMP圖像 fopen
FILE * bmp_fp = fopen(name,"rb");
if (NULL == bmp_fp)
{
return -1;
}
//2.讀取BMP文件的圖像信息,獲取BMP的寬和高
BITMAPINFOHEADER headerinfo;
BITMAPFILEHEADER headerfile;
fseek(bmp_fp,sizeof(headerfile),SEEK_SET);
fread(&headerinfo,1,sizeof(headerinfo),bmp_fp); //讀取40位元組
printf("bmp width = %d,height = %d\n",headerinfo.biWidth,headerinfo.biHeight);
//3.讀取BMP圖*片的顏色分量 800*480*3
char *bmp_buf = calloc(1,headerinfo.biWidth*headerinfo.biHeight*(headerinfo.biBitCount/8));
fread(bmp_buf,1,headerinfo.biWidth*headerinfo.biHeight*(headerinfo.biBitCount/8),bmp_fp);
//4.關閉BMP
fclose(bmp_fp);
//5.打開LCD open
int lcd_fd = open(lcd_mp,O_RDWR);
//6.對LCD進行記憶體映射 mmap
lcd_mp = (int *)mmap(NULL,800*480*4,PROT_READ|PROT_WRITE,MAP_SHARED,lcd_fd,0);
//7.迴圈的把BMP圖像的顏色分量依次寫入到LCD的像素點中
int i = 0;
int data = 0;
for (int y = y1+headerinfo.biHeight-1; y >= y1; y--)
{
for (int x = x1; x < x1+headerinfo.biWidth ; ++x)
{
//把BMP圖片的一個像素點的顏色分量轉換為LCD屏幕的一個像素點的顏色分量格式 ARGB <--- BGR
data |= bmp_buf[i]; //B
data |= bmp_buf[i+1]<<8; //G
data |= bmp_buf[i+2]<<16; //R
lcd_mp[800 * y + x] = data; //BGR BGR BGR ....
i+=3;
data = 0;
}
}
//8.關閉LCD
close(lcd_fd);
munmap(lcd_mp,800*480*4);
}
int main(int argc, char const *argv[])
{
int x,y;
//1.用戶輸入任意位置的坐標
printf("please input your x and y coordinate:");
scanf("%d %d",&x,&y);
ShowBmp(argv[1],x,y,"/dev/fb0");
return 0;
}