因為bmp檔案的寬度如果不是4的倍數,就會自動填充。因為這個問題掉到坑里了,導致是黑白的,下面這個**考慮填充的問題,關鍵在下面的skip**。我的機器顯示屏是24位的,bmp檔案也是24位的,測試**如下
/*************************
*bmp.c檔案
*************************/
#include "bmp.h"
/*************************
*fbp,對映記憶體起始位址
*scrinfo,螢幕資訊結構體
*bmpname,.bmp位**件名
*************************/
int show_photo(char *fbp, struct fb_var_screeninfo *scrinfo, const char *bmpname)
//讀檔案資訊
if (1 != fread( &filehead, sizeof(bitmapfileheader),1, fb))
if (memcmp(filehead.bftype, "bm", 2) != 0)
//讀位圖資訊
if (1 != fread( (char *)&infohead, sizeof(bitmapinfoheader),1, fb))
printf("bfoffbits:%d\n", filehead.bfoffbits);
//跳轉至資料區
fseek(fb, filehead.bfoffbits, seek_set);
printf("bibitcount:%d\n", infohead.bibitcount);
int len = infohead.bibitcount / 8; //原圖乙個畫素佔幾位元組
int bits_len = bits_per_pixel / 8; //螢幕乙個畫素佔幾位元組//迴圈顯示
int icount = 2;
long ibytescount = 0;
int skip = 4-((infohead.biwidth*infohead.bibitcount)>>3)&3;
printf("skip:%d\n", skip);
while(!feof(fb))
if (line_y == infohead.biheight-1 && line_x == infohead.biwidth-1)
*(fbp + location) = rgb.blue; //藍色的色深
*(fbp + location + 1) = rgb.green; //綠色的色深
*(fbp + location + 2) = rgb.red; //紅色的色深
line_x++;
if (line_x == infohead.biwidth )
;if (skip != fread(tmp, 1, skip, fb))
line_x = 0;
line_y++;
if(line_y == infohead.biheight)
break;
}
}printf("show ibytescount:%d\n", ibytescount);
fclose(fb);
return 0;
}
#include "bmp.h"
struct fb_var_screeninfo vinfo;
struct fb_fix_screeninfo finfo;
//列印fb驅動中fix結構資訊,注:在fb驅動載入後,fix結構不可被修改。
void printfixedinfo ()
//列印fb驅動中var結構資訊,注:fb驅動載入後,var結構可根據實際需要被重置
void printvariableinfo ()
int main()
;//開啟裝置檔案
devfb = open("/dev/fb0", o_rdwr);
if(!devfb)
//獲取finfo資訊並顯示
if (ioctl (devfb, fbioget_fscreeninfo, &finfo) == -1)
printfixedinfo ();
//獲取vinfo資訊並顯示
if (ioctl (devfb, fbioget_vscreeninfo, &vinfo) == -1)
printvariableinfo ();
if(24 != vinfo.bits_per_pixel)//32
printf("sizeof(bitmapfileheader):%d\n", sizeof(bitmapfileheader));
printf("sizeof(bitmapinfoheader):%d\n", sizeof(bitmapinfoheader));
//計算需要的對映記憶體大小
screensize = vinfo.xres_virtual * vinfo.yres_virtual * vinfo.bits_per_pixel / 8;
//記憶體對映
fbp = (char *)mmap(null, screensize, prot_read | prot_write, map_shared, devfb, 0);
if(-1 == (int)fbp)
memcpy(bmpname, "niu.bmp", strlen("niu.bmp"));
//顯示
show_photo(fbp, &vinfo, bmpname);
//取消對映,關閉檔案
munmap(fbp, screensize);
close(devfb);
return 0;
}
參考文章
顯示裝置framebuffer
分配 設定 註冊dispopr結構體,由display manager.c通過鍊錶管理。dispopr結構體包含顯示裝置的屬性和操作函式。其中fbshowpixel主要用於顯示字型點陣,showpage主要用於視訊記憶體管理。typedef struct dispopr t dispopr,pt d...
Frame Buffer 與顯示屏的對應關係
在系統內會有一段與顯示區域對應的儲存空間,通過改變該儲存空間的內容來改變顯示屏的內容,該儲存空間被稱為 frame buffer,或視訊記憶體。顯示屏上的每個畫素與 frame buffer 裡的某個記憶體單元對應,所以顯示問題首先要計算 frame buffer 的大小以及確定屏上的每一畫素與 f...
framebuffer 程式設計
這是乙個關於如何程式設計的文件,因此,請在你編譯或執行例子之前,正確配置你的framebuffer裝置。用framebuffer裝置,你可以把你的計算機螢幕當成乙個真正的圖形裝置。你可以修改解析度,重新整理率,色彩深度等。最好的一點是,你可以把畫素點繪在任何你想要的地方。framebuffer裝置不...