framebuffer顯示bmp檔案,考慮填補問題

2021-08-10 06:09:12 字數 3017 閱讀 6783

因為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裝置不...