bmp实现图像缩放
??? bmp刷圖是比較簡單的,它需要注意的是bmp在windows系統下會自動生成54個字
節的頭文件結構體信息,如果要在知道bmp圖的圖像尺寸的話,就可以用lseek函數直接跳過這54個字節直接讀取自己想要的RGB圖像數據,bmp圖像不同的是它的圖像讀取順序,是從左到右,從上到下,所以要刷到LCD屏幕中顯示,需要進行顛倒圖像數據。還有就是bmp圖像RGB圖像是3個字節即24位,但LCD一個像素點是4個字節,需要每3個字節刷到4個字節,跳過一個字節。
??? 因為在這次項目中,不是簡單的把圖刷進去,而是對不符合屏幕尺寸的圖像可以自動識別并進行放大縮小來適應屏幕,所以事先是不知道圖片的尺寸的,要利用bmp的頭文件信息結構體知道該圖像的長寬,所以就不能跳過這54個字節,而是跳過14的字節。以上是bmp圖刷到LCD屏幕的所有注意事項,下面是實現代碼。
#include "../inc/include.h"typedef unsigned char BYTE; typedef unsigned short WORD; typedef unsigned long DWORD; typedef long LONG;typedef struct tagBITMAPINFOHEADER {DWORD biSize;LONG biWidth;LONG biHeight;WORD biPlanes;WORD biBitCount;DWORD biCompression;DWORD biSizeImage;LONG biXPelsPerMeter;LONG biYPelsPerMeter;DWORD biClrUsed;DWORD biClrImportant; } BITMAPINFOHEADER;int show_bmp(char *name) //顯示bmp圖片 {BITMAPINFOHEADER info_head;unsigned char *bmp_buf;int fd_bmp = open(name, O_RDWR);if (fd_bmp < 0){perror("bmp open fail");return -1;}//跳過14個字節的頭文件信息,直接讀取BITMAPINFOHEADER結構體lseek(fd_bmp, 14, SEEK_SET);read(fd_bmp, &info_head, sizeof(BITMAPINFOHEADER));if ((info_head.biHeight != 480) || (info_head.biWidth != 800)){printf("This bmp_image is (%d*%d),I have changed it to 800*480.\n", info_head.biWidth, info_head.biHeight);}unsigned char bmp_prebuf[info_head.biWidth * info_head.biHeight *3];read(fd_bmp, bmp_prebuf, sizeof(bmp_prebuf));close(fd_bmp);//用最鄰近插值來實現圖像的變換bmp_buf = insert_near(bmp_prebuf, info_head.biWidth, info_head.biHeight, 800, 480);bzero(lcd, LCD_SIZE);usleep(1000);/*由于bmp圖片只有三個字節數據,而且刷圖順序是從下往上,要進行數據轉換*/for (int line = 0; line < 480; ++line){for (int pixel = 0; pixel < 800; ++pixel){int s = (line*800 + pixel) * 3;pre_lcd[479-line][pixel] = (bmp_buf[s+0]) | (bmp_buf[s+1]<<8) | (bmp_buf[s+2]<<16);}}return 0; }?
總結
- 上一篇: 170多年技术+无人机!摄影测量迎来新的
- 下一篇: linux挂在网络文件系统出现 INFO