請問可以從HBITMAP中直接保存為一個bmp文件嗎?


掃描后回來了HBITMAP,我不需要顯示,直接保存怎么做,謝謝

4 个解决方案

#1


你可以使用
LONG GetBitmapBits(
  HBITMAP hbmp,      // handle to bitmap
  LONG cbBuffer,     // number of bytes to copy
  LPVOID lpvBits     // pointer to buffer to receive bits
);
得到位圖信息,再存為文件。

下面是位圖文件的結構:
typedef struct tagBITMAPFILEHEADER
{
WORDbfType;   // 位圖文件的類型,必須為BM
DWORD   bfSize;   // 位圖文件的大小,以字節為單位
WORDbfReserved1;  // 位圖文件保留字,必須為0
WORDbfReserved2;  // 位圖文件保留字,必須為0
DWORD   bfOffBits; // 位圖數據的起始位置,以相對於位圖
// 文件頭的偏移量表示,以字節為單位
} BITMAPFILEHEADER;

---- 3. 位圖信息頭 

BMP位圖信息頭數據用於說明位圖的尺寸等信息。
typedef struct tagBITMAPINFOHEADER{
   DWORD  biSize;   // 本結構所占用字節數
   LONGbiWidth;  // 位圖的寬度,以像素為單位
   LONGbiHeight; // 位圖的高度,以像素為單位
   WORD   biPlanes; // 目標設備的級別,必須為1
   WORD   biBitCount// 每個像素所需的位數,必須是1(雙色),
  // 4(16色),8(256色)或24(真彩色)之一
   DWORD  biCompression;   // 位圖壓縮類型,必須是 0(不壓縮),
  // 1(BI_RLE8壓縮類型)或2(BI_RLE4壓縮類型)之一
   DWORD  biSizeImage; // 位圖的大小,以字節為單位
   LONGbiXPelsPerMeter; // 位圖水平分辨率,每米像素數
   LONGbiYPelsPerMeter;  // 位圖垂直分辨率,每米像素數
   DWORD  biClrUsed;// 位圖實際使用的顏色表中的顏色數
   DWORD  biClrImportant;// 位圖顯示過程中重要的顏色數
} BITMAPINFOHEADER;

---- 4. 顏色表 

---- 顏色表用於說明位圖中的顏色,它有若干個表項,每一個表項是一個RGBQUAD類型的結構,定義 一種顏色。RGBQUAD結構的定義如下: 

typedef struct tagRGBQUAD {
BYTErgbBlue;// 藍色的亮度(值范圍為0-255)
BYTErgbGreen;   // 綠色的亮度(值范圍為0-255)
BYTErgbRed; // 紅色的亮度(值范圍為0-255)
BYTErgbReserved;// 保留,必須為0
} RGBQUAD;
顏色表中RGBQUAD結構數據的個數有biBitCount來確定:
當biBitCount=1,4,8時,分別有2,16,256個表項;
當biBitCount=24時,沒有顏色表項。
   位圖信息頭和顏色表組成位圖信息,BITMAPINFO結構定義如下:
typedef struct tagBITMAPINFO {
   BITMAPINFOHEADER bmiHeader;   // 位圖信息頭
   RGBQUAD  bmiColors[1];  // 顏色表
} BITMAPINFO;

---- 5. 位圖數據 

---- 位圖數據記錄了位圖的每一個像素值,記錄順序是在掃描行內是從左到右,掃描行之間是從下到 上。位圖的一個像素值所占的字節數: 

當biBitCount=1時,8個像素占1個字節;
當biBitCount=4時,2個像素占1個字節;
當biBitCount=8時,1個像素占1個字節;
當biBitCount=24時,1個像素占3個字節;

Windows規定一個掃描行所占的字節數必須是 4的倍數(即以long為單位),不足的以0填充, 

一個掃描行所占的字節數計算方法: DataSizePerLine= (biWidth* biBitCount+31)/8; 

// 一個掃描行所占的字節數 DataSizePerLine= DataSizePerLine/4*4; // 字節數必須是4的倍數 

位圖數據的大小(不壓縮情況下): DataSize= DataSizePerLine* biHeight; 

#2


MSDN-〉索引:Storing an Image

#3


可以,用我寫的函數,

HANDLE MakeDib(HBITMAP hbitmap, UINT bits)
{
HANDLE              hdib ;
HDC                 hdc ;
BITMAP              bitmap ;
UINT                wLineLen ;
DWORD               dwSize ;
DWORD               wColSize ;
LPBITMAPINFOHEADER  lpbi ;
LPBYTE              lpBits ;

GetObject(hbitmap,sizeof(BITMAP),&bitmap) ;

//
// DWORD align the width of the DIB
// Figure out the size of the colour table
// Calculate the size of the DIB
//
wLineLen = (bitmap.bmWidth*bits+31)/32 * 4;
wColSize = sizeof(RGBQUAD)*((bits <= 8) ? 1<<bits : 0);
dwSize = sizeof(BITMAPINFOHEADER) + wColSize +
(DWORD)(UINT)wLineLen*(DWORD)(UINT)bitmap.bmHeight;

//
// Allocate room for a DIB and set the LPBI fields
//
hdib = GlobalAlloc(GHND,dwSize);
if (!hdib)
return hdib ;

lpbi = (LPBITMAPINFOHEADER)GlobalLock(hdib) ;

lpbi->biSize = sizeof(BITMAPINFOHEADER) ;
lpbi->biWidth = bitmap.bmWidth ;
lpbi->biHeight = bitmap.bmHeight ;
lpbi->biPlanes = 1 ;
lpbi->biBitCount = (WORD) bits ;
lpbi->biCompression = BI_RGB ;
lpbi->biSizeImage = dwSize - sizeof(BITMAPINFOHEADER) - wColSize ;
lpbi->biXPelsPerMeter = 0 ;
lpbi->biYPelsPerMeter = 0 ;
lpbi->biClrUsed = (bits <= 8) ? 1<<bits : 0;
lpbi->biClrImportant = 0 ;

//
// Get the bits from the bitmap and stuff them after the LPBI
//
lpBits = (LPBYTE)(lpbi+1)+wColSize ;

hdc = CreateCompatibleDC(NULL) ;

GetDIBits(hdc,hbitmap,0,bitmap.bmHeight,lpBits,(LPBITMAPINFO)lpbi, DIB_RGB_COLORS);

// Fix this if GetDIBits messed it up....
lpbi->biClrUsed = (bits <= 8) ? 1<<bits : 0;

DeleteDC(hdc) ;
GlobalUnlock(hdib);

return hdib ;
}

SaveBmpToFile(HANDLE hDib, LPCSTR path)
{
     BITMAPFILEHEADER bmfh;
 LPBITMAPINFOHEADER lbmpHdr=(LPBITMAPINFOHEADER)GlobalLock(hDib);
 bmfh.bfType = 0x4d42;   /* 'BM'for bitmap*/
 bmfh.bfSize = (DWORD)sizeof(BITMAPINFOHEADER)  
   + sizeof(BITMAPFILEHEADER)
   +lbmpHdr->biClrUsed*4
   + lbmpHdr->biSizeImage;
 bmfh.bfReserved1 = 0;
 bmfh.bfReserved2 = 0;
 bmfh.bfOffBits = (DWORD)sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER)+lbmpHdr->biClrUsed*4 ;
     CFile file;
 file.Open(path,CFile::modeCreate|CFile::modeWrite);
 file.Write(&bmfh,sizeof(BITMAPFILEHEADER));
 file.Write(lbmpHdr,GlobalSize(hDib));
 file.Close();
}

 你可以這樣用我的函數
 HANDLE hDib=(hBitmap,nBits);//nBIts可以為8,16,24
 SaveBmpToFile(hDib, "C:\\java.bmp");

#4


好象不行

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com