gdi中位圖物件是很常見的gdi物件,但是無論是sdk,還是mfc都沒有提供現在 的函式或是方法來將乙個位圖物件儲存為乙個bmp檔案,這裡介紹一下儲存方法。
位**件格式:
dib檔案有四個主要部分:
檔案表頭 (bitmapfileheader)
資訊表頭 (bitmapinfoheader)
調色盤(不一定有)
點陣圖圖素位
而乙個位圖物件和上述唯一不同在於它沒有檔案表頭。
(1)檔案表頭
typedef struct tagbitmapfileheader bitmapfileheader, *pbitmapfileheader;
(typedef struct tagbitmapinfoheader bitmapinfoheader, *pbitmapinfoheader;2)資訊表頭
(typedef struct tagrgbquad // rgb3)調色盤結構:
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...