導航:首頁 > 文件處理 > vcbmp壓縮

vcbmp壓縮

發布時間:2022-07-04 07:21:43

A. VC打開BMP圖像

程序已經發到你的郵箱。

B. vc/mfc中bmp文件保存的問題

硬體設備無關的圖像文件格式,使用非常廣。它採用位映射存儲格式,除了圖像深度可選以外,不採用其他任何壓縮,因此,BMP文件所佔用的空間很大。BMP文件的圖像深度可選lbit、4bit、8bit及24bit。BMP文件存儲數據時,圖像的掃描方式是按從左到右、從下到上的順序。
由於BMP文件格式是Windows環境中交換與圖有關的數據的一種標准,因此在Windows環境中運行的圖形圖像軟體都支持BMP圖像格式。[編輯本段]文件結構:
典型的BMP圖像文件由四部分組成:
1:點陣圖文件頭數據結構,它包含BMP圖像文件的類型、顯示內容等信息;
2:點陣圖信息數據結構,它包含有BMP圖像的寬、高、壓縮方法,以及定義顏色等信息;
3:調色板,這個部分是可選的,有些點陣圖需要調色板,有些點陣圖,比如真彩色圖(24位的BMP)就不需要調色板;
4:點陣圖數據,這部分的內容根據BMP點陣圖使用的位數不同而不同,在24點陣圖中直接使用RGB,而其他的小於24位的使用調色板中顏色索引值。
點陣圖的類型:
點陣圖一共有兩種類型,即:設備相關點陣圖(DDB)和設備無關點陣圖(DIB)。DDB點陣圖在早期的Windows系統(Windows 3.0以前)中是很普遍的,事實上它也是唯一的。然而,隨著顯示器製造技術的進步,以及顯示設備的多樣化,DDB點陣圖的一些固有的問題開始浮現出來了。比如,它不能夠存儲(或者說獲取)創建這張圖片的原始設備的解析度,這樣,應用程序就不能快速的判斷客戶機的顯示設備是否適合顯示這張圖片。為了解決這一難題,微軟創建了DIB點陣圖格式。
設備無關點陣圖 (Device-Independent Bitmap)
DIB點陣圖包含下列的顏色和尺寸信息:
* 原始設備(即創建圖片的設備)的顏色格式。
* 原始設備的解析度。
* 原始設備的調色板
* 一個位數組,由紅、綠、藍(RGB)三個值代表一個像素。
* 一個數組壓縮標志,用於表明數據的壓縮方案(如果需要的話)。
以上這些信息保存在BITMAPINFO結構中,該結構由BITMAPINFOHEADER結構和兩個或更多個RGBQUAD結構所組成。BITMAPINFOHEADER結構所包含的成員表明了圖像的尺寸、原始設備的顏色格式、以及數據壓縮方案等信息。RGBQUAD結構標識了像素所用到的顏色數據。
DIB點陣圖也有兩種形式,即:底到上型DIB(bottom-up),和頂到下型DIB(top-down)。底到上型DIB的原點(origin)在圖像的左下角,而頂到下型DIB的原點在圖像的左上角。如果DIB的高度值(由BITMAPINFOHEADER結構中的biHeight成員標識)是一個正值,那麼就表明這個DIB是一個底到上型DIB,如果高度值是一個負值,那麼它就是一個頂到下型DIB。注意:頂到下型的DIB點陣圖是不能被壓縮的。
點陣圖的顏色格式是通過顏色面板值(planes)和顏色位值(bitcount)計算得來的,顏色面板值永遠是1,而顏色位值則可以是1、4、8、16、24、32其中的一個。如果它是1,則表示點陣圖是一張單色點陣圖(譯者註:通常是黑白點陣圖,只有黑和白兩種顏色,當然它也可以是任意兩種指定的顏色),如果它是4,則表示這是一張VGA點陣圖,如果它是8、16、24、或是32,則表示該點陣圖是其他設備所產生的點陣圖。如果應用程序想獲取當前顯示設備(或列印機)的顏色位值(或稱位深度),可調用API函數GetDeviceCaps(),並將第二個參數設為BITSPIXEL即可。
顯示設備的解析度是以每米多少個像素來表明的,應用程序可以通過以下三個步驟來獲取顯示設備或列印機的水平解析度:
1. 調用GetDeviceCaps()函數,指定第二個參數為HORZRES。
2. 再次調用GetDeviceCaps()函數,指定第二個參數為HORZSIZE。
3. 用第一個返回值除以第二個返回值。即:DetDeviceCaps(hDC,HORZRES)/GetDeviceCaps(hDC,HORZSIZE);
應用程序也可以使用相同的三個步驟來獲取設備的垂直解析度,不同之處只是要將HORZRES替換為VERTRES,把HORZSIZE替換為VERTSIZE,即可。
調色板是被保存在一個RGBQUAD結構的數組中,該結構指出了每一種顏色的紅、綠、藍的分量值。位數組中的每一個索引都對應於一個調色板項(即一個RGBQUAD結構),應用程序將根據這種對應關系,將像素索引值轉換為像素RGB值(真實的像素顏色)。應用程序也可以通過調用GetDeviceCaps()函數來獲取當前顯示設備的調色板尺寸(將該函數的第二個參數設為NUMCOLORS即可)。
Win32 API支持位數據的壓縮(只對8位和4位的底到上型DIB點陣圖)。壓縮方法是採用運行長度編碼方案(RLE),RLE使用兩個位元組來描述一個句法,第一個位元組表示重復像素的個數,第二個位元組表示重復像素的索引值。有關壓縮點陣圖的詳細信息請參見對BITMAPINFOHEADER結構的解釋。
應用程序可以從一個DDB點陣圖創建出一個DIB點陣圖,步驟是,先初始化一些必要的結構,然後再調用GetDIBits()函數。不過,有些顯示設備有可能不支持這個函數,你可以通過調用GetDeviceCaps()函數來確定一下(GetDeviceCaps()函數在調用時指定RC_DI_BITMAP作為RASTERCAPS的標志)。
應用程序可以用DIB去設置顯示設備上的像素(譯者註:也就是顯示DIB),方法是調用SetDIBitsToDevice()函數或調用StretchDIBits()函數。同樣,有些顯示設備也有可能不支持以上這兩個函數,這時你可以指定RC_DIBTODEV作為RASTERCAPS標志,然後調用GetDeviceCaps()函數來判斷該設備是否支持SetDIBitsToDevice()函數。也可以指定RC_STRETCHDIB作為RASTERCAPS標志來調用GetDeviceCaps()函數,來判斷該設備是否支持StretchDIBits()函數。
如果應用程序只是要簡單的顯示一個已經存在的DIB點陣圖,那麼它只要調用SetDIBitsToDevice()函數就可以。比如一個電子表格軟體,它可以打開一個圖表文件,在窗口中簡單的調用SetDIBitsToDevice()函數,將圖形顯示在窗口中。但如果應用程序要重復的繪制點陣圖的話,則應該使用BitBlt()函數,因為BitBlt()函數的執行速度要比SetDIBitsToDevice()函數快很多。
設備相關點陣圖 (Device-Dependent Bitmaps)
設備相關點陣圖(DDB)之所以現在還被系統支持,只是為了兼容舊的Windows 3.0軟體,如果程序員現在要開發一個與點陣圖有關的程序,則應該盡量使用或生成DIB格式的點陣圖。
DDB點陣圖是被一個單個結構BITMAP所描述,這個結構的成員標明了該點陣圖的寬度、高度、設備的顏色格式等信息。
DDB點陣圖也有兩種類型,即:可廢棄的(discardable)DDB和不可廢棄的(nondiscardable)DDB。可廢棄的DDB點陣圖就是一種當系統內存缺乏,並且該點陣圖也沒有被選入設備描述表(DC)的時候,系統就會把該DDB點陣圖從內存中清除(即廢棄)。不可廢棄的DDB則是無論系統內存多少都不會被系統清除的DDB。API函數CreateDiscardableBitmap()函數可用於創建可廢棄點陣圖。而函數CreateBitmap()、CreateCompatibleBitmap()、和CreateBitmapIndirect()可用於創建不可廢棄的點陣圖。
應用程序可以通過一個DIB點陣圖而創建一個DDB點陣圖,只要先初始化一些必要的結構,然後再調用CreateDIBitmap()函數就可以。如果在調用該函數時指定了CBM_INIT標志,那麼這一次調用就等價於先調用CreateCompatibleBitmap()創建當前設備格式的DDB點陣圖,然後又調用SetDIBits()函數轉換DIB格式到DDB格式。(可能有些設備並不支持SetDIBits()函數,你可以指定RC_DI_BITMAP作為RASTERCAPS的標志,然後調用GetDeviceCaps()函數來判斷一下)。
對應的數據結構:
1:BMP文件組成
BMP文件由文件頭、點陣圖信息頭、顏色信息和圖形數據四部分組成。
2:BMP文件頭(14位元組)
BMP文件頭數據結構含有BMP文件的類型、文件大小和點陣圖起始位置等信息。
其結構定義如下:
typedef struct tagBITMAPFILEHEADER
{
WORD bfType; // 點陣圖文件的類型,必須為BM(0-1位元組)
DWORD bfSize; // 點陣圖文件的大小,以位元組為單位(2-5位元組)
WORD bfReserved1; // 點陣圖文件保留字,必須為0(6-7位元組)
WORD bfReserved2; // 點陣圖文件保留字,必須為0(8-9位元組)
DWORD bfOffBits; // 點陣圖數據的起始位置,以相對於點陣圖(10-13位元組)
// 文件頭的偏移量表示,以位元組為單位
} BITMAPFILEHEADER;
3:點陣圖信息頭(40位元組)
BMP點陣圖信息頭數據用於說明點陣圖的尺寸等信息。
typedef struct tagBITMAPINFOHEADER{
DWORD biSize; // 本結構所佔用位元組數(14-17位元組)
LONG biWidth; // 點陣圖的寬度,以像素為單位(18-21位元組)
LONG biHeight; // 點陣圖的高度,以像素為單位(22-25位元組)
WORD biPlanes; // 目標設備的級別,必須為1(26-27位元組)
WORD biBitCount;// 每個像素所需的位數,必須是1(雙色),(28-29位元組)
// 4(16色),8(256色)或24(真彩色)之一
DWORD biCompression; // 點陣圖壓縮類型,必須是 0(不壓縮),(30-33位元組)
// 1(BI_RLE8壓縮類型)或2(BI_RLE4壓縮類型)之一
DWORD biSizeImage; // 點陣圖的大小,以位元組為單位(34-37位元組)
LONG biXPelsPerMeter; // 點陣圖水平解析度,每米像素數(38-41位元組)
LONG biYPelsPerMeter; // 點陣圖垂直解析度,每米像素數(42-45位元組)
DWORD biClrUsed;// 點陣圖實際使用的顏色表中的顏色數(46-49位元組)
DWORD biClrImportant;// 點陣圖顯示過程中重要的顏色數(50-53位元組)
} BITMAPINFOHEADER;
4:顏色表
顏色表用於說明點陣圖中的顏色,它有若干個表項,每一個表項是一個RGBQUAD類型的結構,定義一種顏色。RGBQUAD結構的定義如下:
typedef struct tagRGBQUAD {
BYTE rgbBlue;// 藍色的亮度(值范圍為0-255)
BYTE rgbGreen; // 綠色的亮度(值范圍為0-255)
BYTE rgbRed; // 紅色的亮度(值范圍為0-255)
BYTE rgbReserved;// 保留,必須為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填充,
biSizeImage = ((((bi.biWidth * bi.biBitCount) + 31) & ~31) / 8) * bi.biHeight;
具體數據舉例:
如某BMP文件開頭:
4D42 4690 0000 0000 0000 4600 0000 2800 0000 8000 0000 9000 0000 0100*1000 0300 0000 0090 0000 A00F 0000 A00F 0000 0000 0000 0000 0000*00F8 0000 E007 0000 1F00 0000 0000 0000*02F1 84F1 04F1 84F1 84F1 06F2 84F1 06F2 04F2 86F2 06F2 86F2 86F2 .... ....
BMP文件可分為四個部分:點陣圖文件頭、點陣圖信息頭、彩色板、圖像數據陣列,在上圖中已用*分隔。
另外,虛機團上產品團購,超級便宜

C. 關於vc++中 bmp文件的讀取

點陣圖的那些信息結構本身Windows定義的有啊,你為什麼要重新定義?這樣的函數我使用過,沒有問題啊,應該是你自己定義的結構體的問題。

D. 我想要一段把一張BMP格式的圖片壓縮的vc+程序

,BMP圖像文件

?BMP最早使用的圖像文件在Windows操作系統是一個標準的圖像文件格式,在Windows操作系統是最簡單的圖像格式。

?BMP圖像格式是非常簡單的,具有隻是最基本的圖像數據存儲功能,並且可以被存儲為每個像素的一個4位,8位和24位的點陣圖。雖然它提供的信息過於簡單,但由於Windows系統的普及,以及BMP本身有一個簡單的格式,標准,透明,BMP圖像文件格式得到了推廣,它一般是用於在屏幕上顯示Windows系統以及一些簡單的圖像系統中。

這種格式的特點是包含豐富的圖像信息幾乎沒有壓縮,但由此產生的與生俱來的固有的缺點 - 佔用磁碟空間過大。在網頁中很少使用。

?24位,800×600的BMP格式的圖形文件大小:
800×600×3byte 1440000byte≈1440byte≈1.44M

?二,GIF圖像文件

?GIF格式的特點是高壓縮比,所佔用較少的磁碟空間,所以在Web頁面中使用了大量的圖像。

?GIF有兩個版本:

?GIF87A:單一的靜止圖像被簡單地用來存儲。
?GIF89a的幾件也可以存儲的靜止圖像,從而形成一個連續的動畫,成為支持2D動畫格式。您可以指定透明區域,使圖像具有非同尋常的展示,這使GIF風光十足。在互聯網上,大量的彩色動畫文件多為這種格式。像素藝術。 N多QQ秀,QQ空間,QQ的東西。
?GIF圖像格式還增加淡入,換言之,在圖像轉印過程中時,用戶可以看到的圖像的大致輪廓,然後繼續與轉印過程和看到的圖像的細節部分,並適應用戶從朦朧到清晰地收看心理。

?由於八個存儲格式,因此它不能被存儲256個以上的彩色圖像,總量少於256色的使用的圖片顏色的限制。

?最佳的屏幕顯示GIF格式:

?如果顏色越少,顏色小於256,調色板可以選擇為「准確」。
?不投票的「失真」。
?在一般情況下,調色板來選擇「最合適的」,最大顏色數選擇「256」。如果顏色是略超過256種顏色,的抖動被設置為「100%」。
?為了防止鋸齒狀邊緣不需要透明的,不透明的,盡可能。
?一個小竅門:

?網頁切片導出為GIF格式,色彩豐富,不與出口的出口一片。按鈕,如下圖所示:

?第三,JPEG圖像文件

?JPEG文件的擴展名jpg或。 JPEG,壓縮技術十分先進,它用有損壓縮,去除冗餘的圖像和彩色數據獲得一個非常高的壓縮率,同時該展會是非常豐富的,生動的圖像,換句話說,用最少的磁碟空間得到更好的的圖像質量。

?JPEG 2000是由JPEG組織負責開發,JPEG,它具有更高的壓縮比和更多的新功能,新一代的靜止圖像壓縮技術。
JPEG2000作為JPEG壓縮比的升級版,比JPEG高約30%。只能支持不同,JPEG,JPEG2000同時支持有損和無損壓縮,而JPEG有損壓縮。無損壓縮保存一些重要圖片是有用的。
?JPEG2000是一個非常重要的特點是,它可以實現漸進傳輸,這的GIF「變臉」有異曲同工之妙,第一次傳輸的圖像的輪廓,然後逐步傳輸數據,不斷提高圖像質量,使圖像由朦朧到清晰顯示。

此外,JPEG2000支持所謂的「區域利益」的功能,你可以指定你感興趣的領域的?壓縮質量的圖像的任何部分,你也可以選擇指定第一個解壓縮。?

?JPG圖像的注意點:圖像質量和文件尺寸之間找到一個平衡點。一般,80%的壓縮率是較合適地使用在Web頁面。

另存為圖像處理軟體可以使用Windows附件也可以使用圖像處理軟體進行轉換。如:ACDSEE,PHOTOSHOP軟體。

E. 如何在VC中讀取彩色BMP格式的圖像的像素值

法,再有針對性的研究VC如何做圖像處理,有以下資料可參考(網上多得是)
1. 圖像文件的格式;

2. 圖像編程的基礎-操作調色板;

3. 圖像數據的讀取、存儲和顯示、如何獲取圖像的尺寸等;

4. 利用圖像來美化界面;

5. 圖像的基本操作:圖像移動、圖像旋轉、圖像鏡像、圖像的縮放、圖像的剪切板操作;

6. 圖像顯示的各種特技效果;

7. 圖像的基本處理:圖像的二值化、圖像的亮度和對比度的調整、圖像的邊緣增強、如何得到圖像的直方圖、圖像直方圖的修正、圖像的平滑、圖像的銳化等、圖像的偽彩色、彩色圖像轉換為黑白圖像、物體邊緣的搜索等等;

8. 二值圖像的處理:腐蝕、膨脹、細化、距離變換等;

9. 圖像分析:直線、圓、特定物體的識別;

10.JEPG、GIF、PCX等格式文件相關操作;

11.圖像文件格式的轉換;

12.圖像的常用變換:付利葉變換、DCT變換、沃爾什變換等;

13.AVI視頻流的操作;

圖像處理技術博大精深,不僅需要有很強的數學功底,還需要熟練掌握一門計算機語言,在當前流行的語言中,我個人覺的Visual C++這個開發平台是圖像開發人員的首選工具。本講座只是起到拋磚引玉的作用,希望和廣大讀者共同交流。
VC數字圖像處理編程講座之二

第一節 圖像的文件格式

要利用計算機對數字化圖像進行處理,首先要對圖像的文件格式要有清楚的認識,因為我們前面說過,自然界的圖像以模擬信號的形式存在,在用計算機進行處理以前,首先要數字化,比如攝像頭(CCD)攝取的信號在送往計算機處理前,一般情況下要經過數模轉換,這個任務常常由圖像採集卡完成,它的輸出一般為裸圖的形式;如果用戶想要生成目標圖像文件,必須根據文件的格式做相應的處理。隨著科技的發展,數碼像機、數碼攝像機已經進入尋常百姓家,我們可以利用這些設備作為圖像處理系統的輸入設備來為後續的圖像處理提供信息源。無論是什麼設備,它總是提供按一定的圖像文件格式來提供信息,比較常用的有BMP 格式、JPEG格式、GIF格式等等,所以我們在進行圖像處理以前,首先要對圖像的格式要有清晰的認識,只有在此基礎上才可以進行進一步的開發處理。

在講述圖像文件格式前,先對圖像作一個簡單的分類。除了最簡單的圖像外,所有的圖像都有顏色,而單色圖像則是帶有顏色的圖像中比較簡單的格式,它一般由黑色區域和白色區域組成,可以用一個比特表示一個像素,"1"表示黑色,"0"表示白色,當然也可以倒過來表示,這種圖像稱之為二值圖像。我們也可以用8個比特(一個位元組)表示一個像素,相當於把黑和白等分為256個級別,"0"表示為黑,"255"表示為白,該位元組的數值表示相應像素值的灰度值或亮度值,數值越接近"0",對應像素點越黑,相反,則對應像素點越白,此種圖像我們一般稱之為灰度圖像。單色圖像和灰度圖像又統稱為黑白圖像,與之對應存在著彩色圖像,這種圖像要復雜一些,表示圖像時,常用的圖像彩色模式有RGB模式、CMYK模式和HIS模式,一般情況下我們只使用RGB模式,R 對應紅色,G對應綠色,B對應藍色,它們統稱為三基色,這三中色彩的不同搭配,就可以搭配成各種現實中的色彩,此時彩色圖像的每一個像素都需要3個樣本組成的一組數據表示,其中每個樣本用於表示該像素的一個基本顏色。

對於現存的所有的圖像文件格式,我們在這里主要介紹BMP圖像文件格式,並且文件里的圖像數據是未壓縮的,因為圖像的數字化處理主要是對圖像中的各個像素進行相應的處理,而未壓縮的BMP圖像中的像素數值正好與實際要處理的數字圖像相對應,這種格式的文件最合適我們對之進行數字化處理。請讀者記住,壓縮過的圖像是無法直接進行數字化處理的,如JPEG、GIF等格式的文件,此時首先要對圖像文件解壓縮,這就要涉及到一些比較復雜的壓縮演算法。後續章節中我們將針對特殊的文件格式如何轉換為BMP格式的文件問題作專門的論述,經過轉換,我們就可以利用得到的未壓縮的BMP文件格式進行後續處理。對於JPEG、GIF等格式,由於涉及到壓縮演算法,這要求讀者掌握一定的資訊理論方面的知識,如果展開的話,可以寫一本書,限於篇幅原因,我們只作一般性的講解,有興趣的朋友可以參考相關書籍資料。

一、BMP文件結構

1. BMP文件組成

BMP文件由文件頭、點陣圖信息頭、顏色信息和圖形數據四部分組成。文件頭主要包含文件的大小、文件類型、圖像數據偏離文件頭的長度等信息;點陣圖信息頭包含圖象的尺寸信息、圖像用幾個比特數值來表示一個像素、圖像是否壓縮、圖像所用的顏色數等信息。顏色信息包含圖像所用到的顏色表,顯示圖像時需用到這個顏色表來生成調色板,但如果圖像為真彩色,既圖像的每個像素用24個比特來表示,文件中就沒有這一塊信息,也就不需要操作調色板。文件中的數據塊表示圖像的相應的像素值,需要注意的是:圖像的像素值在文件中的存放順序為從左到右,從下到上,也就是說,在BMP文件中首先存放的是圖像的最後一行像素,最後才存儲圖像的第一行像素,但對與同一行的像素,則是按照先左邊後右邊的的順序存儲的;另外一個需要讀者朋友關注的細節是:文件存儲圖像的每一行像素值時,如果存儲該行像素值所佔的位元組數為4的倍數,則正常存儲,否則,需要在後端補0,湊足4的倍數。

2. BMP文件頭

BMP文件頭數據結構含有BMP文件的類型、文件大小和點陣圖起始位置等信息。其結構定義如下:

typedef struct tagBITMAPFILEHEADER
{
WORD bfType; // 點陣圖文件的類型,必須為"BM"
DWORD bfSize; // 點陣圖文件的大小,以位元組為單位
WORD bfReserved1; // 點陣圖文件保留字,必須為0
WORD bfReserved2; // 點陣圖文件保留字,必須為0
DWORD bfOffBits; // 點陣圖數據的起始位置,以相對於點陣圖文件頭的偏移量表示,以位元組為單位
} BITMAPFILEHEADER;該結構占據14個位元組。

3. 點陣圖信息頭

BMP點陣圖信息頭數據用於說明點陣圖的尺寸等信息。其結構如下:

typedef struct tagBITMAPINFOHEADER{
DWORD biSize; // 本結構所佔用位元組數
LONG biWidth; // 點陣圖的寬度,以像素為單位
LONG biHeight; // 點陣圖的高度,以像素為單位
WORD biPlanes; // 目標設備的平面數不清,必須為1
WORD biBitCount// 每個像素所需的位數,必須是1(雙色), 4(16色),8(256色)或24(真彩色)之一
DWORD biCompression; // 點陣圖壓縮類型,必須是 0(不壓縮),1(BI_RLE8壓縮類型)或2(BI_RLE4壓縮類型)之一
DWORD biSizeImage; // 點陣圖的大小,以位元組為單位
LONG biXPelsPerMeter; // 點陣圖水平解析度,每米像素數
LONG biYPelsPerMeter; // 點陣圖垂直解析度,每米像素數
DWORD biClrUsed;// 點陣圖實際使用的顏色表中的顏色數
DWORD biClrImportant;// 點陣圖顯示過程中重要的顏色數
} BITMAPINFOHEADER;該結構占據40個位元組。

注意:對於BMP文件格式,在處理單色圖像和真彩色圖像的時候,無論圖象數據多麼龐大,都不對圖象數據進行任何壓縮處理,一般情況下,如果點陣圖採用壓縮格式,那麼16色圖像採用RLE4壓縮演算法,256色圖像採用RLE8壓縮演算法。

4. 顏色表

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

typedef struct tagRGBQUAD {
BYTErgbBlue;// 藍色的亮度(值范圍為0-255)
BYTErgbGreen; // 綠色的亮度(值范圍為0-255)
BYTErgbRed; // 紅色的亮度(值范圍為0-255)
BYTErgbReserved;// 保留,必須為0
} RGBQUAD;

顏色表中RGBQUAD結構數據的個數由BITMAPINFOHEADER 中的biBitCount項來確定,當biBitCount=1,4,8時,分別有2,16,256個顏色表項,當biBitCount=24時,圖像為真彩色,圖像中每個像素的顏色用三個位元組表示,分別對應R、G、B值,圖像文件沒有顏色表項。點陣圖信息頭和顏色表組成點陣圖信息,BITMAPINFO結構定義如下:

typedef struct tagBITMAPINFO {
BITMAPINFOHEADER bmiHeader; // 點陣圖信息頭
RGBQUAD bmiColors[1]; // 顏色表
} BITMAPINFO;

注意:RGBQUAD數據結構中,增加了一個保留欄位rgbReserved,它不代表任何顏色,必須取固定的值為"0",同時, RGBQUAD結構中定義的顏色值中,紅色、綠色和藍色的排列順序與一般真彩色圖像文件的顏色數據排列順序恰好相反,既:若某個點陣圖中的一個像素點的顏色的描述為"00,00,ff,00",則表示該點為紅色,而不是藍色。

5. 點陣圖數據

點陣圖數據記錄了點陣圖的每一個像素值或該對應像素的顏色表的索引值,圖像記錄順序是在掃描行內是從左到右,掃描行之間是從下到上。這種格式我們又稱為Bottom_Up點陣圖,當然與之相對的還有Up_Down形式的點陣圖,它的記錄順序是從上到下的,對於這種形式的點陣圖,也不存在壓縮形式。點陣圖的一個像素值所佔的位元組數:當biBitCount=1時,8個像素佔1個位元組;當biBitCount=4時,2個像素佔1個位元組;當 biBitCount=8時,1個像素佔1個位元組;當biBitCount=24時,1個像素佔3個位元組,此時圖像為真彩色圖像。當圖像不是為真彩色時,圖像文件中包含顏色表,點陣圖的數據表示對應像素點在顏色表中相應的索引值,當為真彩色時,每一個像素用三個位元組表示圖像相應像素點彩色值,每個位元組分別對應R、G、B分量的值,這時候圖像文件中沒有顏色表。上面我已經講過了,Windows規定圖像文件中一個掃描行所佔的位元組數必須是4的倍數(即以字為單位),不足的以0填充,圖像文件中一個掃描行所佔的位元組數計算方法:

DataSizePerLine= (biWidth* biBitCount+31)/8;// 一個掃描行所佔的位元組數

點陣圖數據的大小按下式計算(不壓縮情況下):

DataSize= DataSizePerLine* biHeight。

上述是BMP文件格式的說明,搞清楚了以上的結構,就可以正確的操作圖像文件,對它進行讀或寫操作了。

。。。。。。

F. VC中BMP圖片如何轉換Tiff文件格式

我用掃描儀掃描了一批.bmp文件,客戶要求按.pdf格式刻盤,請教高手怎麼能批量...轉換成PDF文件的軟體:對有損壓縮的JPG文件及採用JPEG/OJPEG演算法壓縮的TIFF...

G. VC中如何將BMP圖像轉化成JPG圖像

你用photo shop將bmp打開另存為jpg就可以啊,如果數量大還可以設置批量處理。要在VC中實現就不只是代碼的事了,主要涉及壓縮演算法。演算法有版權啊!

H. VC中如何將內存中的bmp數據轉化成jpg數據

//datecompress 圖片的質量(只有在轉換成jpg有效) //nSize 圖片緩沖區的大小(要轉的圖片數據大小) //PicDate 這是一個指針,指向你的圖片的 unsigned int size=0;//得到圖像大小 BYTE* buffers;//存儲圖像數據的緩沖 Bitmap *image = CreateBitmapFromMemory(PicDate,nSize); //把你的圖像數據載入入內存 SaveBitmapToMemory(image,(void **)&buffers,&size,CodecIndex,datecompress); //轉換成你要的類型,從buffers獲取 //說明:CodecIndex取值0-4,分別對應轉換為jpg、bmp、gif、png、tiff格式,當為0ompr時,參數datecess有用,表示轉換jpg的質量,取值0-100,數值越小,壓縮比越大。//這里是你的代碼 ..... //這里是你的代碼 delete image; delete buffers;

把這些代碼放入聲明

Bitmap* CreateBitmapFromMemory(const void *buf, size_t size); void* SaveBitmapToMemory(Bitmap *image, void **outbuf, size_t *size, size_t CodecIndex, ULONG quality);

把這些代碼加入到你的源文件最後

I. VC的MFC編程時窗口顯示多張bmp點陣圖的問題

給你拷貝了一段,你應該能看懂吧,我也是這么用的

void CMyView::OnDraw (CDC* pDC)
{
CRect rc;
CDC dc;
GetClientRect(&rc);

CBitmap bmp; //用來存臨時圖象的點陣圖
dc.CreateCompatibleDC(pDC); //依附窗口DC創建兼容內存DC
bmp.CreateCompatibleBitmap(pDC,rc.Width(),rc.Height());

//創建兼容點陣圖(必須用pDC創建,否則畫出的圖形變成黑色)
CBitmap *pOldBit=dc.SelectObject(&bmp);
dc.FillSolidRect(rc,RGB(255,255,255));

//按原來背景填充客戶區,不然會是黑色
//畫圖,添加你要畫圖的代碼,不過用dc畫,而不是pDC;
......

pDC->BitBlt(0,0,rc.Width(),rc.Height(),&dc,0,0,SRCCOPY);//將內存DC上的圖象拷貝到前台

dc.DeleteDC(); //刪除DC
bmp.DeleteObject(); //刪除點陣圖
return true;
//這里一定要用return true,如果用自動生成的,會調用基類,把畫出來的覆蓋,就什麼結果也沒有了
}

閱讀全文

與vcbmp壓縮相關的資料

熱點內容
java自動格式化 瀏覽:617
ipad怎麼查看文件夾大小 瀏覽:581
手工粘土解壓球 瀏覽:550
在線視頻教育源碼 瀏覽:39
快四十學什麼編程 瀏覽:754
gnumakelinux 瀏覽:537
視易峰雲伺服器怎麼改系統 瀏覽:535
javamap取值 瀏覽:768
mac和win磁碟加密軟體 瀏覽:474
蘋果為什麼會連接不到伺服器 瀏覽:726
pdf格式文件如何保存 瀏覽:303
小霸王伺服器tx什麼意思 瀏覽:75
解釋dns命令 瀏覽:584
dmx512怎麼編程 瀏覽:744
北京雲主機17t雲伺服器 瀏覽:232
php伺服器url地址 瀏覽:440
哪裡看書免費app 瀏覽:437
php刪除數組中重復值 瀏覽:786
經理下命令咱都別說話是什麼意思 瀏覽:625
上海風機可編程式控制制器價格 瀏覽:249