?? bcb_g3.htm
字號:
<html>
<head>
<title>BMP位圖文件結構及平滑縮放</title>
<meta http-equiv="目錄類型" content="文本/html; 字符集=gb2312">
</head>
<body bgcolor="#FFFFFF">
<table width="100%" border="0" height="285">
<tr>
<td height="35">
<div align="center" class="p14"><font color="#000000">BMP位圖文件結構及平滑縮放</font></div>
</td>
</tr>
<tr valign="top">
<td>
<p><font color=#ffffff>----</font> 用普通方法顯示BMP位圖,占內存大,速度慢,在圖形縮小時,失真嚴重,在低顏色位數的設備上顯示高顏色位數的圖形圖形時失真大。本文采用視頻函數顯示BMP位圖,可以消除以上的缺點。
<p><font color=#ffffff>----</font> <b>一、BMP文件結構</b>
<p><font color=#ffffff>----</font> 1. BMP文件組成
<p><font color=#ffffff>----</font> BMP文件由文件頭、位圖信息頭、顏色信息和圖形數據四部分組成。
<p><font color=#ffffff>----</font> 2. BMP文件頭
<p><font color=#ffffff>----</font> BMP文件頭數據結構含有BMP文件的類型、文件大小和位圖起始位置等信息。
<p><font color=#ffffff>----</font> 其結構定義如下:
<p>typedef struct tagBITMAPFILEHEADER<br>
{<br>
WORDbfType; // 位圖文件的類型,必須為BM<br>
DWORD bfSize; // 位圖文件的大小,以字節為單位<br>
WORDbfReserved1; // 位圖文件保留字,必須為0<br>
WORDbfReserved2; // 位圖文件保留字,必須為0<br>
DWORD bfOffBits; // 位圖數據的起始位置,以相對于位圖<br>
// 文件頭的偏移量表示,以字節為單位<br>
} BITMAPFILEHEADER;<br>
</p>
<font
color=#ffffff>----</font> 3. 位圖信息頭
<p><font color=#ffffff>----</font>
<p>BMP位圖信息頭數據用于說明位圖的尺寸等信息。<br>
typedef struct tagBITMAPINFOHEADER{<br>
DWORD biSize; // 本結構所占用字節數<br>
LONGbiWidth; // 位圖的寬度,以像素為單位<br>
LONGbiHeight; // 位圖的高度,以像素為單位<br>
WORD biPlanes; // 目標設備的級別,必須為1<br>
WORD biBitCount// 每個像素所需的位數,必須是1(雙色),<br>
// 4(16色),8(256色)或24(真彩色)之一<br>
DWORD biCompression; // 位圖壓縮類型,必須是 0(不壓縮),<br>
// 1(BI_RLE8壓縮類型)或2(BI_RLE4壓縮類型)之一<br>
DWORD biSizeImage; // 位圖的大小,以字節為單位<br>
LONGbiXPelsPerMeter; // 位圖水平分辨率,每米像素數<br>
LONGbiYPelsPerMeter; // 位圖垂直分辨率,每米像素數<br>
DWORD biClrUsed;// 位圖實際使用的顏色表中的顏色數<br>
DWORD biClrImportant;// 位圖顯示過程中重要的顏色數<br>
} BITMAPINFOHEADER;<br>
</p>
<font
color=#ffffff>----</font> 4. 顏色表
<p><font color=#ffffff>----</font> 顏色表用于說明位圖中的顏色,它有若干個表項,每一個表項是一個RGBQUAD類型的結構,定義一種顏色。RGBQUAD結構的定義如下:
<p>typedef struct tagRGBQUAD {<br>
BYTErgbBlue;// 藍色的亮度(值范圍為0-255)<br>
BYTErgbGreen; // 綠色的亮度(值范圍為0-255)<br>
BYTErgbRed; // 紅色的亮度(值范圍為0-255)<br>
BYTErgbReserved;// 保留,必須為0<br>
} RGBQUAD;<br>
顏色表中RGBQUAD結構數據的個數有biBitCount來確定:<br>
當biBitCount=1,4,8時,分別有2,16,256個表項;<br>
當biBitCount=24時,沒有顏色表項。<br>
位圖信息頭和顏色表組成位圖信息,BITMAPINFO結構定義如下:<br>
typedef struct tagBITMAPINFO {<br>
BITMAPINFOHEADER bmiHeader; // 位圖信息頭<br>
RGBQUAD bmiColors[1]; // 顏色表<br>
} BITMAPINFO;<br>
<br>
</p>
<font color=#ffffff>----</font> 5. 位圖數據
<p><font color=#ffffff>----</font> 位圖數據記錄了位圖的每一個像素值,記錄順序是在掃描行內是從左到右,掃描行之間是從下到上。位圖的一個像素值所占的字節數:
<p>當biBitCount=1時,8個像素占1個字節;<br>
當biBitCount=4時,2個像素占1個字節;<br>
當biBitCount=8時,1個像素占1個字節;<br>
當biBitCount=24時,1個像素占3個字節;<br>
Windows規定一個掃描行所占的字節數必須是<br>
4的倍數(即以long為單位),不足的以0填充,<br>
一個掃描行所占的字節數計算方法:<br>
DataSizePerLine= (biWidth* biBitCount+31)/8; <br>
// 一個掃描行所占的字節數<br>
DataSizePerLine= DataSizePerLine/4*4; // 字節數必須是4的倍數<br>
位圖數據的大小(不壓縮情況下):<br>
DataSize= DataSizePerLine* biHeight;<br>
</p>
<font color=#ffffff>----</font> <b>二、BMP位圖一般顯示方法</b>
<p><font color=#ffffff>----</font> 1. 申請內存空間用于存放位圖文件
<p><font color=#ffffff>----</font> GlobalAlloc(GHND,FileLength);
<p><font color=#ffffff>----</font> 2. 位圖文件讀入所申請內存空間中
<p><font color=#ffffff>----</font> LoadFileToMemory( mpBitsSrc,mFileName);
<p><font color=#ffffff>----</font> 3. 在OnPaint等函數中用創建顯示用位圖
<p><font color=#ffffff>----</font> 用CreateDIBitmap()創建顯示用位圖,用CreateCompatibleDC()創建兼容DC,
<p><font color=#ffffff>----</font> 用SelectBitmap()選擇顯示位圖。
<p><font color=#ffffff>----</font> 4. 用BitBlt或StretchBlt等函數顯示位圖
<p><font color=#ffffff>----</font> 5. 用DeleteObject()刪除所創建的位圖
<p><font color=#ffffff>----</font> 以上方法的缺點是: 1)顯示速度慢; 2) 內存占用大; 3) 位圖在縮小顯示時圖形失真大,(可通過安裝字體平滑軟件來解決);
4) 在低顏色位數的設備上(如256顯示模式)顯示高顏色位數的圖形(如真彩色)圖形失真嚴重。
<p><font color=#ffffff>----</font> <b>三、BMP位圖縮放顯示</b>
<p><font color=#ffffff>----</font> 用DrawDib視頻函數來顯示位圖,內存占用少,速度快,而且還可以對圖形進行淡化(Dithering)處理。淡化處理是一種圖形算法,可以用來在一個支持比圖像所用顏色要少的設備上顯示彩色圖像。BMP位圖顯示方法如下:
<p><font color=#ffffff>----</font> 1. 打開視頻函數DrawDibOpen(),一般放在在構造函數中
<p><font color=#ffffff>----</font> 2. 申請內存空間用于存放位圖文件
<p><font color=#ffffff>----</font> GlobalAlloc(GHND,FileLength);
<p><font color=#ffffff>----</font> 3. 位圖文件讀入所申請內存空間中
<p><font color=#ffffff>----</font> LoadFileToMemory( mpBitsSrc,mFileName);
<p><font color=#ffffff>----</font> 4. 在OnPaint等函數中用DrawDibRealize(),DrawDibDraw()顯示位圖
<p><font color=#ffffff>----</font> 5. 關閉視頻函數DrawDibClose(),一般放在在析構函數中
<p><font color=#ffffff>----</font> 以上方法的優點是: 1)顯示速度快; 2) 內存占用少; 3) 縮放顯示時圖形失真小,4)
在低顏色位數的設備上顯示高顏色位數的圖形圖形時失真小; 5) 通過直接處理位圖數據,可以制作簡單動畫。
<p><font color=#ffffff>----</font> <b>四、CViewBimap類編程要點</b>
<p><font color=#ffffff>----</font> 1. 在CViewBimap類中添加視頻函數等成員
<p>HDRAWDIB m_hDrawDib; // 視頻函數<br>
HANDLEmhBitsSrc; // 位圖文件句柄(內存)<br>
LPSTR mpBitsSrc; // 位圖文件地址(內存)<br>
BITMAPINFOHEADER *mpBitmapInfo; // 位圖信息頭<br>
</p>
<font color=#ffffff>----</font> 2. 在CViewBimap類構造函數中添加打開視頻函數
<p><font color=#ffffff>----</font> m_hDrawDib= DrawDibOpen();
<p><font color=#ffffff>----</font> 3. 在CViewBimap類析構函數中添加關閉視頻函數
<p>if( m_hDrawDib != NULL)<br>
{<br>
DrawDibClose( m_hDrawDib);<br>
m_hDrawDib = NULL;<br>
}<br>
</p>
<font
color=#ffffff>----</font> 4. 在CViewBimap類圖形顯示函數OnPaint中添加GraphicDraw()
<p>voidCViewBitmap::OnPaint()<br>
{<br>
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -