儲存BITMAP到檔案

2021-05-21 21:47:27 字數 3286 閱讀 1136

gdi中位圖物件是很常見的gdi物件,但是無論是sdk,還是mfc都沒有提供現在 的函式或是方法來將乙個位圖物件儲存為乙個bmp檔案,這裡介紹一下儲存方法。

位**件格式:

dib檔案有四個主要部分:

檔案表頭 (bitmapfileheader)

資訊表頭  (bitmapinfoheader)

調色盤(不一定有) 

點陣圖圖素位

而乙個位圖物件和上述唯一不同在於它沒有檔案表頭。

(1)檔案表頭

typedef struct tagbitmapfileheader  bitmapfileheader, *pbitmapfileheader;

2)資訊表頭

typedef struct tagbitmapinfoheader bitmapinfoheader, *pbitmapinfoheader;

3)調色盤結構:

typedef struct tagrgbquad // rgb

rgbquad ;

注意這個結構應該是乙個陣列,在256色及以下的bmp檔案中存在,陣列的長度關鍵看顏色數。

bitmap定義了乙個點陣圖的型別、長度、寬度、顏色格式等,這個結構一般用getobject來獲得。定義如下:typedef struct tagbitmap bitmap, *pbitmap

乙個位圖物件也就是存在記憶體中的點陣圖,它與存在硬碟上的bmp檔案相比,唯一的區別就是它沒有bitmapfileheader這個檔案資訊 頭,其餘部分是完全相同的,所以我們要做的就是先構造乙個檔案資訊頭,寫入檔案中,然後將記憶體中的點陣圖寫入檔案。

源**如下:(只寫主要部分)

word wbitscount;//點陣圖中每個畫素所佔位元組數。

dword dwpalettelsize=0;// 調色盤大小

dword dwbmdibitsize,dwdibsize,dwwritten;

bitmap bitmap;// 定義了點陣圖的各種的資訊。

bitmapfileheader bmfhdr;// 定義了大小、型別等bmp檔案的資訊。

bitmapinfoheader bi;

lpbitmapinfoheader lpbi;

handle fh,fdib ;

getobject(hbitmap,sizeof(bitmap),(void *)&bitmap);//得到bitmap結構。

// 以下**是用bitmap的資訊填充bitmapinfoheader結構

wbitscount=bitmap.bmbitspixel;

bi.bisize=sizeof(bitmapinfoheader);

bi.biwidth=bitmap.bmwidth;

bi.biheight=bitmap.bmheight;

bi.biplanes=1;

bi.bibitcount= bitmap.bmbitspixel ;

bi.biclrimportant=0;

bi.biclrused=0;

bi.bicompression=bi_rgb;

bi.bisizeimage=0;

bi.biypelspermeter=0;

bi.bixpelspermeter=0;

//以下**是獲取調色盤的長度,調色盤現在的用處很少,因為256色的點陣圖已經不多了。

if(wbitscount<=8)

dwpalettelsize=(1dwbmdibitsize=((bitmap.bmwidth*wbitscount+31)/8)*bitmap.bmheight;

fdib=globalalloc(ghnd,dwbmdibitsize+dwpalettelsize+sizeof(bitmapinfoheader));

lpbi=(lpbitmapinfoheader)::globallock(fdib);

*lpbi=bi;// 將bi中的資料寫入分配的記憶體中。

hdc=::getdc(null);

getdibits(hdc,hbitmap,0,(uint)bitmap.bmheight,(lpstr)lpbi+sizeof(bitmapinfoheader)+dwpalettelsize,(bitmapinfo *)lpbi,dib_rgb_colors);

/*getdibits是最重要的函式,真正獲得位圖資料的工作就由它完成,它第乙個引數為hdc,第二個引數為位圖控制代碼,第三個引數為掃瞄行 的開始行,一般為0,第四個為結束行,一般就是高度,第四個引數最重要,它表示接收資料的起始位址,這個位址一般是在調色盤之後。第五個引數指的是接收 bitmapinfo結構的位址,這個結構上面沒有寫,它其實就是bitmapinfo結構加上調色盤資訊。最後乙個引數是格式。一般是 dib_rgb_colors*/

//建立檔案以及檔案資訊頭

fh=createfile(filename,generic_write,0,null,create_always,file_attribute_normal|file_flag_sequential_scan,null);

if(fh==invalid_handle_value)

return false;

bmfhdr.bftype=0x4d42;//bmp型別,一定要這樣寫

dwdibsize=sizeof(bitmapfileheader)+sizeof(bitmapinfoheader)+dwbmdibitsize+dwpalettelsize;// 文 件總長,由幾個部分組成

bmfhdr.bfsize=dwdibsize;

bmfhdr.bfreserved1=0;

bmfhdr.bfreserved2=0;

bmfhdr.bfoffbits=(dword)sizeof(bitmapfileheader)+ (dword)sizeof(bitmapinfoheader)+dwpalettelsize;//位圖資料相對於檔案頭的偏移量

//將檔案資訊頭寫入檔案

writefile(fh,(lpstr)&bmfhdr,sizeof(bitmapfileheader),&dwwritten,null);

//將資料寫入檔案,包含bitmapinfo結構、調色盤、資料

writefile(fh,(lpstr)lpbi,dwdibsize,&dwwritten,null);

//關閉相關控制代碼

::globalunlock(fdib);

::globalfree(fdib);

::closehandle(fh);

return true;

Android 儲存bitmap到相簿

安卓原生的儲存相簿方法可以用但是可調引數很少,對三星這樣的手機支援不好,的建立時間一般為1970.1.1,可以通過複寫android原生的方法來新增相關引數,比如 建立時間和gps位置資訊什麼的 下面是儲存到相簿用的函式 insert an image and create a thumbnail ...

儲存phpinfo到檔案

全新編譯了php 5.5.10,沒有安裝apache,想檢視一下php.ini在什麼位置。那就,輸出phpinfo 終端輸出來沒有換行,簡直就不是人讀的。那就,輸出到檔案 終端執行 php w phpinfo.php 檔案w phpinfo.php myfile fopen result.txt w...

Bitmap到CBitmap的轉換

bitmap tpbitmap new bitmap width,height,pixelformat24bpprgb hbitmap aaa1 bitmap bm tpbitmap gethbitmap color 0,0,0 aaa1 cbitmap pbm cbitmap fromhandle...