① linux平台下 OPENGL 貼圖問題 我希望讀取BMP圖片 並貼圖在一個矩形上 但是現在貼圖效果很差。。。
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_LINEAR);
試試看復,制圖像長寬最好是2的冪。
② 懸賞問題:在TQ2440開發板linux中怎樣用一個函數讀取bmp格式圖片中一個像素點的色彩信息
這個需要了解 BMP圖片的格式。每一個像素點都是 由4個位元組表示版的,所權以只要讀取4個位元組 然後根據不同的格式 轉化一下就可以得到 RGB 的三原色了。
例如: 如 一張bmp 是24位真彩色的,那讀取後面的實際數據 第一個 4位元組數據就是 (0,0)像素點 ,可以得到它的 三原色值。後面的像素點一次類推 往後每增加 一個像素點就讀下一個 4位元組數據。
③ 如何製作點陣圖(.bmp)文件
可以用photoshop打開JPG文件,然後另存為bmp文件。此外,windows自帶的附件中的畫圖軟體,也可以把圖片直接保存為bmp格式的,不知是否對樓主有用?
④ linux中怎麼將文件壓縮成.bmp.gz文件
如果希望壓到特定的目錄下:tar -cvzf /絕對路徑/my.tar.gz /root/*.bmp
⑤ linux 平台下有沒有BMP圖片解碼庫
參考:http://www.cnblogs.com/shengansong/archive/2011/09/23/2186409.html
http://code.google.com/p/libbmp/
說到圖片,點陣圖(Bitmap)當然是最簡單的,它是Windows顯示圖片的基本格式,其文件擴展名為*.BMP。由於沒有經過任何的壓縮,故BMP圖 片往往很大。在Windows下,任何格式的圖片文件都要轉化為點陣圖格式才能顯示出來,各種格式的圖片文件也都是在點陣圖格式的基礎上採用不同的壓縮演算法生 成的。
一、下面我們來看看點陣圖文件(*.BMP)的格式。
點陣圖文件主要分為如下4個部分:
塊名稱
對應Windows結構體定義 大小(Byte)
文件信息頭 BITMAPFILEHEADER 14
點陣圖信息頭 BITMAPINFOHEADER 40
顏色表(調色板)RGBQUAD(可選)
點陣圖數據(RGB顏色陣列) BYTE* 由圖像長寬尺寸決定
1.文件信息頭BITMAPFILEHEADER
結構體定義如下:
typedef struct tagBITMAPFILEHEADER {
UINT bfType;
Dword bfSize;
UINT bfReserved1;
UINT bfReserved2;
DWORD bfOffBits;
} BITMAPFILEHEADER;
其中:
bfType 表示文件的類型,該值必需是0x4D42,也就是字元'BM'。
bfSize 表示該點陣圖文件的大小,用位元組為單位
bfReserved1 保留,必須設置為0
bfReserved2保留,必須設置為0
bfOffBits 表示從文件頭開始到實際的圖象數據之間的位元組的偏移量。這個參數是非常有用的,因為點陣圖信息頭
和調色板的長度會根據不同情況而變化,所以你可以用這個偏移值迅速的從文件中讀取到位數據。
2、點陣圖信息頭BITMAPINFOHEADER
結構體定義如下:
typedef struct tagBITMAPINFOHEADER {
DWORD biSize;
LONG biWidth;
LONG biHeight;
WORD biPlanes;
WORD biBitCount;
DWORD biCompression;
DWORD biSizeImage;
LONG biXPelsPerMeter;
LONG biYPelsPerMeter;
DWORD biClrUsed;
DWORD biClrImportant;
} BITMAPINFOHEADER;
其中:
biSize 表示BITMAPINFOHEADER結構所需要的位元組數。
biWidth 表示圖象的寬度,以象素為單位。
biHeight 表示圖象的高度,以象素為單位。註:這個值除了用於描述圖像的高度之外,它還有另一個用處,就是指明該圖像是倒向的點陣圖,還是正向的點陣圖。
如果該值是一個正數,說明圖像是倒向的,如果該值是一個負數,則說明圖像是正向的。大多數的BMP文件都是倒向的點陣圖,也就是時,高度值是一個正數。
biPlanes為目標設備說明位面數,其值將總是被設為1。
biBitCount表示比特數/象素,其值為1、4、8、16、24、或32。但是由於我們平時用到的圖像絕大部分是24位和32位的,所以我們討論這兩類圖像。
biCompression 表示圖象數據壓縮的類型,同樣我們只討論沒有壓縮的類型:BI_RGB。
biSizeImage表示圖象的大小,以位元組為單位。當用BI_RGB格式時,可設置為0。
biXPelsPerMeter表示水平解析度,用象素/米表示。
biYPelsPerMeter表示垂直解析度,用象素/米表示。
biClrUsed表示點陣圖實際使用的彩色表中的顏色索引數(設為0的話,則說明使用所有調色板項)。
biClrImportant 表示對圖象顯示有重要影響的顏色索引的數目,如果是0,表示都重要。
3、顏色表RGBQUAD:
顏色表用於說明點陣圖中的顏色,它有若干個表項,每一個表項是一個RGBQUAD類型的結構,定義一種顏色。 這個部分是可選的,有些點陣圖需要顏色表,有些點陣圖,比如真彩色圖(24位的BMP)就不需要顏色表,因為點陣圖中的RGB值就代表了每個象素的顏色。但是16位r5g6b5位域彩色圖像需要顏色表。
RGBQUAD結構的定義如下:
typedef struct tagRGBQUAD {
BYTE rgbBlue;// 藍色的亮度(值范圍為0-255)
BYTE rgbGreen; // 綠色的亮度(值范圍為0-255)
BYTE rgbRed; // 紅色的亮度(值范圍為0-255)
BYTE rgbReserved;// 保留,必須為0
} RGBQUAD;
點陣圖信息頭和顏色表組成點陣圖信息,BITMAPINFO結構定義如下:
typedef struct tagBITMAPINFO {
BITMAPINFOHEADER bmiHeader; // 點陣圖信息頭
RGBQUAD bmiColors[1]; // 顏色表
} BITMAPINFO;
而文件信息頭和點陣圖信息組成點陣圖文件,BITMAPFILE結構定義如下:
typedef struct tagBITMAP
{
BITMAPFILEHEADER bfHeader;
BITMAPINFO biInfo;
}BITMAPFILE;
4. 點陣圖數據(RGB顏色陣列)
點陣圖數據記錄了點陣圖的每一個像素值,記錄順序是:掃描行內是從左到右,掃描行之間是從下到上。點陣圖的一個像素值所佔的位元組數:
當biBitCount=1時,8個像素佔1個位元組;
當biBitCount=4時,2個像素佔1個位元組;
當biBitCount=8時,1個像素佔1個位元組;
當biBitCount=24時,1個像素佔3個位元組;
當biBitCount=32時,1個像素佔4個位元組;
Windows規定一個掃描行所佔的位元組數必須是4的倍數(即以long為單位),不足的以0填充。
這部分就是圖片真正的數據,比如一張圖片的大小為800*600,則該部分數據的長度就應該為800*600像素,也即800*600*24/8位元組(如果是24位的圖片,即一個像素用24bit來存儲,每個像素點上有3個位元組,分別用來表示b,g,r的顏色)。
有關RGB三色空間我想大家都很熟悉,這里我想說的是在Windows下,RGB顏色陣列存儲的格式其實BGR。也就是說,對於24位的RGB點陣圖像素數據格式是:
藍色B值
綠色G值
紅色R值
對於32位的RGB點陣圖像素數據格式是:
藍色B值
綠色G值
紅色R值
透明通道A值
透明通道也稱Alpha通道,該值是該像素點的透明屬性,取值在0(全透明)到255(不透明)之間。對於24位的圖像來說,因為沒有Alpha通道,故整個圖像都不透明。
二.根據對BMP格式的說明,我們可以輕易的寫出一個生成BMP圖像的函數:
首先需要點陣圖數據,然後加上文件信息頭和點陣圖信息頭就可以構成一張BMP圖片了。
注意1:biBitCount與顏色表
biBitCount=1 表示點陣圖最多有兩種顏色,預設情況下是黑色和白色,你也可以自己定義這兩種顏色。圖像信息頭裝調色板中將有兩個調色板項,稱為索引0和索引1。圖象數據陣列中的每一位表示一個象素。如果一個位是0,顯示時就使用索引0的RGB值,如果位是1,則使用索引1的RGB值。
biBitCount=4 表示點陣圖最多有16種顏色。每個象素用4位表示,並用這4位作為彩色表的表項來查找該象素的顏色。例如,如果點陣圖中的第一個位元組為0x1F,它表示有兩個 象素,第一象素的顏色就在彩色表的第2表項中查找,而第二個象素的顏色就在彩色表的第16表項中查找。此時,調色板中預設情況下會有16個RGB項。對應 於索引0到索引15。
biBitCount=8 表示點陣圖最多有256種顏色。每個象素用8位表示,並用這8位作為彩色表的表項來查找該象素的顏色。例如,如果點陣圖中的第一個位元組為0x1F,這個象素的顏色就在彩色表的第32表項中查找。此時,預設情況下,調色板中會有256個RGB項,對應於索引0到索引255。
biBitCount=16 表示點陣圖最多有65536種顏色。每個色素用16位(2個位元組)表示。這種格式叫作高彩色,或叫增強型16位色,或64K色。它的情況比較復雜,當 biCompression成員的值是BI_RGB時,它沒有調色板。16位中,最低的5位表示藍色分量,中間的5位表示綠色分量,高的5位表示紅色分 量,一共佔用了15位,最高的一位保留,設為0。這種格式也被稱作555 16位點陣圖。如果biCompression成員的值是BI_BITFIELDS,那麼情況就復雜了,首先是原來調色板的位置被三個DWORD變數占據, 稱為紅、綠、藍掩碼。分別用於描述紅、綠、藍分量在16位中所佔的位置。在Windows 95(或98)中,系統可接受兩種格式的位域:555和565,在555格式下,紅、綠、藍的掩碼分別是:0x7C00、0x03E0、0x001F,而 在565格式下,它們則分別為:0xF800、0x07E0、0x001F。你在讀取一個像素之後,可以分別用掩碼「與」上像素值,從而提取出想要的顏色 分量(當然還要再經過適當的左右移操作)。在NT系統中,則沒有格式限制,只不過要求掩碼之間不能有重疊。(註:這種格式的圖像使用起來是比較麻煩的,不 過因為它的顯示效果接近於真彩,而圖像數據又比真彩圖像小的多,所以,它更多的被用於游戲軟體)。
biBitCount=24 表示點陣圖最多有1670萬種顏色。這種點陣圖沒有調色板(bmiColors成員尺寸為0),在位數組中,每3個位元組代表一個象素,分別對應於顏色R、G、B。
biBitCount=32 表示點陣圖最多有2^32種顏色。這種點陣圖的結構與16位點陣圖結構非常類似,當biCompression成員的值是BI_RGB時,它也沒有調色板,32 位中有24位用於存放RGB值,順序是:最高位—保留,紅8位、綠8位、藍8位。這種格式也被成為888 32點陣圖。如果 biCompression成員的值是BI_BITFIELDS時,原來調色板的位置將被三個DWORD變數占據,成為紅、綠、藍掩碼,分別用於描述紅、 綠、藍分量在32位中所佔的位置。在Windows 95(or 98)中,系統只接受888格式,也就是說三個掩碼的值將只能是:0xFF0000、0xFF00、0xFF。而在NT系統中,你只要注意使掩碼之間不產 生重疊就行。(註:這種圖像格式比較規整,因為它是DWORD對齊的,所以在內存中進行圖像處理時可進行匯編級的代碼優化(簡單))。
注意2:位元組補齊
點陣圖數據記錄了點陣圖的每一個像素值,記錄順序是:掃描行內是從左到右,掃描行之間是從下到上。且Windows規定一個掃描行所佔的位元組數必須是4的倍數(即以long為單位),不足的以0填充,所以向文件中寫入的點陣圖數據的大小應該為:
每行圖像的位元組數:bmppitch = ((biWidth * bitCountPerPix + 31) >> 5) << 2;
例如:一張24位10*10的圖片,一行圖像10個像素,共30位元組,由於Windows規定一個掃描行所佔的位元組數必須是4的倍數,而不足的以0填充, 所以一行圖像在文件中實際存儲了32個位元組(補了2位元組的0);而圖片總的大小就不是54+30*10=354位元組,而是54+32*10=374位元組。 (見圖:24-10-10.bmp)
所以:1. 在生成BMP文件時,如果一行圖像的位元組數不是4的倍數,則補0,而補後一行圖像數據的大小的計算公式為:
bmppitch = ((biWidth * bitCountPerPix + 31) >> 5) << 2;
其中,biWidth--圖片的寬度,bitCountPerPix--圖片的位數。
⑥ linux下用C語言生成一個rgb888的BMP圖片,為什麼生成了,打開的時候(圖片瀏覽軟體)提示頭文件有錯
第一眼看到Aspire one happy小?就?得?是一台女生?想要?有的??,蛋?,原因?他,桃?????,就是他漂亮的四色外?,??窗,?然?摸之後??得塑?感有?重,嘉?????,不?亮?的外型搭上1.15kg?巧?重,台中?款,10.1?的?幕不??小,台南????,又能放?手提包中方便??,舞蹈服?,其?是取其平衡的做法。
?用Atom Dual-core N550、1G???是小??很一般的?格,??使用Office或是上???影片,玩一些小????是措措有?。?建W7 Starter及Android??系?,?是能??使用者快速??和上?。
【硬???介?】
▲前正面。
▲右?面分?有SD卡插槽、耳?孔、USB及?路孔。
▲左?面分???源孔、D-sub及??USB。
完整?容??考 MML行?生活?:Aspire one happy ?系?的粉嫩小??
⑦ 如何製作Bitmap(bmp)文件
註:本文參考了林福宗老師的有關BMP文件格式的文章,在此聲明。
簡介
BMP(Bitmap-File)圖形文件是Windows採用的圖形文件格式,在Windows環境下運行的所有圖象處理軟體都支持BMP圖象文件格式。Windows系統內部各圖像繪制操作都是以BMP為基礎的。Windows 3.0以前的BMP圖文件格式與顯示設備有關,因此把這種BMP圖象文件格式稱為設備相關點陣圖DDB(device-dependent bitmap)文件格式。Windows 3.0以後的BMP圖象文件與顯示設備無關,因此把這種BMP圖象文件格式稱為設備無關點陣圖DIB(device-independent bitmap)格式(註:Windows 3.0以後,在系統中仍然存在DDB點陣圖,象BitBlt()這種函數就是基於DDB點陣圖的,只不過如果你想將圖像以BMP格式保存到磁碟文件中時,微軟極力推薦你以DIB格式保存),目的是為了讓Windows能夠在任何類型的顯示設備上顯示所存儲的圖象。BMP點陣圖文件默認的文件擴展名是BMP或者bmp(有時它也會以.DIB或.RLE作擴展名)。
6.1.2 文件結構
點陣圖文件可看成由4個部分組成:點陣圖文件頭(bitmap-file header)、點陣圖信息頭(bitmap-information header)、彩色表(color table)和定義點陣圖的位元組陣列,它具有如下所示的形式。
點陣圖文件的組成 結構名稱 符號
點陣圖文件頭(bitmap-file header)BITMAPFILEHEADERbmfh
點陣圖信息頭(bitmap-information header)BITMAPINFOHEADERbmih
彩色表(color table)RGBQUADaColors[]
圖象數據陣列位元組BYTEaBitmapBits[]
點陣圖文件結構可綜合在表6-01中。
表01 點陣圖文件結構內容摘要
偏移量 域的名稱 大小 內容
圖象文件
頭0000h文件標識2 bytes兩位元組的內容用來識別點陣圖的類型:
『BM』 : Windows 3.1x, 95, NT, …
『BA』 :OS/2 Bitmap Array
『CI』 :OS/2 Color Icon
『CP』 :OS/2 Color Pointer
『IC』 : OS/2 Icon
『PT』 :OS/2 Pointer
註:因為OS/2系統並沒有被普及開,所以在編程時,你只需判斷第一個標識「BM」就行。
0002hFile Size1 dword用位元組表示的整個文件的大小
0006hReserved1 dword保留,必須設置為0
000AhBitmap Data Offset1 dword從文件開始到點陣圖數據開始之間的數據(bitmap data)之間的偏移量
000EhBitmap Header Size1 dword點陣圖信息頭(Bitmap Info Header)的長度,用來描述點陣圖的顏色、壓縮方法等。下面的長度表示:
28h - Windows 3.1x, 95, NT, …
0Ch - OS/2 1.x
F0h - OS/2 2.x
註:在Windows95、98、2000等操作系統中,點陣圖信息頭的長度並不一定是28h,因為微軟已經制定出了新的BMP文件格式,其中的信息頭結構變化比較大,長度加長。所以最好不要直接使用常數28h,而是應該從具體的文件中讀取這個值。這樣才能確保程序的兼容性。
0012hWidth1 dword點陣圖的寬度,以象素為單位
0016hHeight1 dword點陣圖的高度,以象素為單位
001AhPlanes1 word點陣圖的位面數(註:該值將總是1)
圖象
信息
頭
001ChBits Per Pixel1 word每個象素的位數
1 - 單色點陣圖(實際上可有兩種顏色,預設情況下是黑色和白色。你可以自己定義這兩種顏色)
4 - 16 色點陣圖
8 - 256 色點陣圖
16 - 16bit 高彩色點陣圖
24 - 24bit 真彩色點陣圖
32 - 32bit 增強型真彩色點陣圖
001EhCompression1 dword壓縮說明:
0 - 不壓縮 (使用BI_RGB表示)
1 - RLE 8-使用8位RLE壓縮方式(用BI_RLE8表示)
2 - RLE 4-使用4位RLE壓縮方式(用BI_RLE4表示)
3 - Bitfields-位域存放方式(用BI_BITFIELDS表示)
0022hBitmap Data Size1 dword用位元組數表示的點陣圖數據的大小。該數必須是4的倍數
0026hHResolution1 dword用象素/米表示的水平解析度
002AhVResolution1 dword用象素/米表示的垂直解析度
002EhColors1 dword點陣圖使用的顏色數。如8-比特/象素表示為100h或者 256.
0032hImportant Colors1 dword指定重要的顏色數。當該域的值等於顏色數時(或者等於0時),表示所有顏色都一樣重要
調色板數據根據BMP版本的不同而不同PaletteN * 4 byte調色板規范。對於調色板中的每個表項,這4個位元組用下述方法來描述RGB的值: 1位元組用於藍色分量
1位元組用於綠色分量
1位元組用於紅色分量
1位元組用於填充符(設置為0)
圖象數據根據BMP版本及調色板尺寸的不同而不同Bitmap Dataxxx bytes該域的大小取決於壓縮方法及圖像的尺寸和圖像的位深度,它包含所有的點陣圖數據位元組,這些數據可能是彩色調色板的索引號,也可能是實際的RGB值,這將根據圖像信息頭中的位深度值來決定。
構件詳解
1. 點陣圖文件頭
點陣圖文件頭包含有關於文件類型、文件大小、存放位置等信息,在Windows 3.0以上版本的點陣圖文件中用BITMAPFILEHEADER結構來定義:
typedef struct tagBITMAPFILEHEADER { /* bmfh */
UINT bfType;
DWORD bfSize;
UINT bfReserved1;
UINT bfReserved2;
DWORD bfOffBits;
} BITMAPFILEHEADER;
其中:
bfType說明文件的類型.(該值必需是0x4D42,也就是字元'BM'。我們不需要判斷OS/2的點陣圖標識,這么做現在來看似乎已經沒有什麼意義了,而且如果要支持OS/2的點陣圖,程序將變得很繁瑣。所以,在此只建議你檢察'BM'標識)
bfSize說明文件的大小,用位元組為單位
bfReserved1保留,必須設置為0
bfReserved2保留,必須設置為0
bfOffBits說明從文件頭開始到實際的圖象數據之間的位元組的偏移量。這個參數是非常有用的,因為點陣圖信息頭和調色板的長度會根據不同情況而變化,所以你可以用這個偏移值迅速的從文件中讀取到位數據。
2. 點陣圖信息頭
點陣圖信息用BITMAPINFO結構來定義,它由點陣圖信息頭(bitmap-information header)和彩色表(color table)組成,前者用BITMAPINFOHEADER結構定義,後者用RGBQUAD結構定義。BITMAPINFO結構具有如下形式:
typedef struct tagBITMAPINFO { /* bmi */
BITMAPINFOHEADER bmiHeader;
RGBQUAD bmiColors[1];
} BITMAPINFO;
其中:
bmiHeader說明BITMAPINFOHEADER結構,其中包含了有關點陣圖的尺寸及位格式等信息
bmiColors說明彩色表RGBQUAD結構的陣列,其中包含索引圖像的真實RGB值。
BITMAPINFOHEADER結構包含有點陣圖文件的大小、壓縮類型和顏色格式,其結構定義為:
typedef struct tagBITMAPINFOHEADER { /* bmih */
DWORD biSize;
LONG biWidth;
LONG biHeight;
WORD biPlanes;
WORD biBitCount;
DWORD biCompression;
DWORD biSizeImage;
LONG biXPelsPerMeter;
LONG biYPelsPerMeter;
DWORD biClrUsed;
DWORD biClrImportant;
} BITMAPINFOHEADER;
其中:
biSize說明BITMAPINFOHEADER結構所需要的字數。註:這個值並不一定是BITMAPINFOHEADER結構的尺寸,它也可能是sizeof(BITMAPV4HEADER)的值,或是sizeof(BITMAPV5HEADER)的值。這要根據該點陣圖文件的格式版本來決定,不過,就現在的情況來看,絕大多數的BMP圖像都是BITMAPINFOHEADER結構的(可能是後兩者太新的緣故吧:-)。
biWidth說明圖象的寬度,以象素為單位
biHeight說明圖象的高度,以象素為單位。註:這個值除了用於描述圖像的高度之外,它還有另一個用處,就是指明該圖像是倒向的點陣圖,還是正向的點陣圖。如果該值是一個正數,說明圖像是倒向的,如果該值是一個負數,則說明圖像是正向的。大多數的BMP文件都是倒向的點陣圖,也就是時,高度值是一個正數。(註:當高度值是一個負數時(正向圖像),圖像將不能被壓縮(也就是說biCompression成員將不能是BI_RLE8或BI_RLE4)。
biPlanes為目標設備說明位面數,其值將總是被設為1
biBitCount說明比特數/象素,其值為1、4、8、16、24、或32
biCompression說明圖象數據壓縮的類型。
⑧ 擴展名為BMP的點陣圖文件是什麼文件怎麼在文件夾中創建
擴展名為BMP的點陣圖文件:是Windows操作系統所推薦和支持的圖像文件格式。是一種將內存或顯示器的圖像數據不經過壓縮而直接按位存檔的文件格式,所以稱為點陣圖(bitmap)文件。因其文件擴展名為BMP,故稱為BMP文件格式,簡稱BMP文件。
BMP點陣圖文件創建:
1、首先,在Photoshop中新建一個空白圖層,並填充前景色。
2、然後,點擊「文件」將其存儲為bmp格式。
3、最後,選擇24點陣圖保存即可。
BMP文件結構:BMP圖像文件被分成四個部分,點陣圖文件頭(Bitmap
File
Header)、點陣圖信息頭(Bitmap
Info
Header)、顏色表(Color
Map)和點陣圖數據(即圖像數據,Data
Bits或Data
Body)。
⑨ 在EXAM的文件夾中創建一個空白的BMP文件,文件名為嘟嘟,怎麼做呢 把步驟寫下來把
你好朋友;
bmp也就是所說的點陣圖文件;
BMP(全稱Bitmap)是Windows操作系統中的標准圖像文件格式,可以分成兩類:設備相關點陣圖(DDB)和設備無關點陣圖(DIB),使用非常廣。它採用位映射存儲格式,除了圖像深度可選以外,不採用其他任何壓縮,因此,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. 用第一個返回值除以第二個返回值。即:GetDeviceCaps(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文件的類型、文件大小和點陣圖起始位置等信息。
其結構定義如下:
{WORDbfType;//點陣圖文件的類型,必須為BM(1-2位元組)DWORDbfSize;//點陣圖文件的大小,以位元組為單位(3-6位元組,低位在前)WORDbfReserved1;//點陣圖文件保留字,必須為0(7-8位元組)WORDbfReserved2;//點陣圖文件保留字,必須為0(9-10位元組)DWORDbfOffBits;//點陣圖數據的起始位置,以相對於點陣圖(11-14位元組,低位在前)//文件頭的偏移量表示,以位元組為單位}BITMAPFILEHEADER;
3:點陣圖信息頭(40位元組)
BMP點陣圖信息頭數據用於說明點陣圖的尺寸等信息。
{DWORDbiSize;//本結構所佔用位元組數(15-18位元組)LONGbiWidth;//點陣圖的寬度,以像素為單位(19-22位元組)LONGbiHeight;//點陣圖的高度,以像素為單位(23-26位元組)WORDbiPlanes;//目標設備的級別,必須為1(27-28位元組)WORDbiBitCount;//每個像素所需的位數,必須是1(雙色),(29-30位元組)//4(16色),8(256色)16(高彩色)或24(真彩色)之一DWORDbiCompression;//點陣圖壓縮類型,必須是0(不壓縮),(31-34位元組)//1(BI_RLE8壓縮類型)或2(BI_RLE4壓縮類型)之一DWORDbiSizeImage;//點陣圖的大小(其中包含了為了補齊行數是4的倍數而添加的空位元組),以位元組為單位(35-38位元組)LONGbiXPelsPerMeter;//點陣圖水平解析度,每米像素數(39-42位元組)LONGbiYPelsPerMeter;//點陣圖垂直解析度,每米像素數(43-46位元組)DWORDbiClrUsed;//點陣圖實際使用的顏色表中的顏色數(47-50位元組)DWORDbiClrImportant;//點陣圖顯示過程中重要的顏色數(51-54位元組)}BITMAPINFOHEADER;
4:顏色表
顏色表用於說明點陣圖中的顏色,它有若干個表項,每一個表項是一個RGBQUAD類型的結構,定義一種顏色。RGBQUAD結構的定義如下:
typedefstructtagRGBQUAD{BYTErgbBlue;//藍色的亮度(值范圍為0-255)BYTErgbGreen;//綠色的亮度(值范圍為0-255)BYTErgbRed;//紅色的亮度(值范圍為0-255)BYTErgbReserved;//保留,必須為0}RGBQUAD;
顏色表中RGBQUAD結構數據的個數有biBitCount來確定:
當biBitCount=1,4,8時,分別有2,16,256個表項;
當biBitCount=24時,沒有顏色表項。
點陣圖信息頭和顏色表組成點陣圖信息,BITMAPINFO結構定義如下:
typedefstructtagBITMAPINFO{BITMAPINFOHEADERbmiHeader;//點陣圖信息頭RGBQUADbmiColors[1];//顏色表}BITMAPINFO;
5:點陣圖數據
點陣圖數據記錄了點陣圖的每一個像素值,記錄順序是在掃描行內是從左到右,掃描行之間是從下到上。點陣圖的一個像素值所佔的位元組數:
當biBitCount=1時,8個像素佔1個位元組;
當biBitCount=4時,2個像素佔1個位元組;
當biBitCount=8時,1個像素佔1個位元組;
當biBitCount=24時,1個像素佔3個位元組,按順序分別為B,G,R;
Windows規定一個掃描行所佔的位元組數必須是
4的倍數(即以long為單位),不足的以0填充,
biSizeImage = ((((bi.biWidth * bi.biBitCount) + 31) & ~31) / 8) * bi.biHeight;
具體數據舉例:
如某BMP文件開頭:
424D 46900000 0000 0000 4600 0000 2800 0000 8000 0000 9000 0000 0100*1000 0300 0000 0090 0000 A00F 0000 A00F0000 0000 00000000 0000*00F8 E007 1F00 0000*02F1 84F1 04F1 84F1 84F1 06F2 84F1 06F2 04F2 86F2 06F2 86F2 86F2 .... ....
讀取方法
/*
功能:在圖片的第50行畫一條黑線
為簡化代碼,只支持24位色的圖片
codeblocks下正確運行。VC下需要將二維數組img改為malloc動態分配。需要添加#include "stdlib.h"。
*/
#include<stdio.h>#include<windows.h>typedefstruct{BYTEb;BYTEg;BYTEr;}RGB;intmain(void){BITMAPFILEHEADERfileHeader;BITMAPINFOHEADERinfoHeader;FILE*pfin=fopen("原始圖像.bmp","rb");FILE*pfout=fopen("修改後的圖像.bmp","wb");//ReadtheBitmapfileheader;fread(&fileHeader,sizeof(BITMAPFILEHEADER),1,pfin);//ReadtheBitmapinfoheader;fread(&infoHeader,sizeof(BITMAPINFOHEADER),1,pfin);//為簡化代碼,只處理24位彩色if(infoHeader.biBitCount==24){intsize=infoHeader.biWidth*infoHeader.biHeight;RGBimg[infoHeader.biHeight][infoHeader.biWidth];fread(img,sizeof(RGB),size,pfin);//把第50行染成黑色inti=0;for(;i<infoHeader.biWidth;i++){img[50][i].b=img[50][i].g=img[50][i].r=0;}//將修改後的圖片保存到文件fwrite(&fileHeader,sizeof(fileHeader),1,pfout);fwrite(&infoHeader,sizeof(infoHeader),1,pfout);fwrite(img,sizeof(RGB),size,pfout);}fclose(pfin);fclose(pfout);}
文件部分
圖像文件頭
1)1-2:(這里的數字代表的是位元組,下同)圖像文件頭。0x4d42=』BM』,表示是Windows支持的BMP格式。(注意:查ascii表B 0x42,M0x4d,bfType 為兩個位元組,B為low位元組,M為high位元組所以bfType=0x4D42,而不是0x424D,請注意)
2)3-6:整個文件大小。4690 0000,為00009046h=36934。
3)7-8:保留,必須設置為0。
4)9-10:保留,必須設置為0。
5)11-14:從文件開始到點陣圖數據之間的偏移量(14+40+4*(2^biBitCount))(在有顏色板的情況下)。4600 0000,為00000046h=70,上面的文件頭就是35字=70位元組。
點陣圖信息頭
6)15-18:點陣圖圖信息頭長度。
7) 19-22:點陣圖寬度,以像素為單位。8000 0000,為00000080h=128。
8)23-26:點陣圖高度,以像素為單位。9000 0000,為00000090h=144。
9)27-28:點陣圖的位面數,該值總是1。0100,為0001h=1。
10)29-30:每個像素的位數。有1(單色),4(16色),8(256色),16(64K色,高彩色),24(16M色,真彩色),32(4096M色,增強型真彩色)。1000為0010h=16。
11)31-34:壓縮說明:有0(不壓縮),1(RLE 8,8位RLE壓縮),2(RLE 4,4位RLE壓縮,3(Bitfields,位域存放)。RLE簡單地說是採用像素數+像素值的方式進行壓縮。T408採用的是位域存放方式,用兩個位元組表示一個像素,位域分配為r5b6g5。圖中0300 0000為00000003h=3(這張圖片不存在顏色板)。
12)35-38:用位元組數表示的點陣圖數據的大小,該數必須是4的倍數,數值上等於:一行所佔的位元組數×點陣圖高度。0090 0000為00009000h=80×90×2h=36864。假設點陣圖是24位,寬為41,高為30,則數值= (biWidth*biBitCount+31)/32*4*biHeight,即=(41*24+31)/32*4*30=3720
13)39-42:用象素/米表示的水平解析度。A00F 0000為0000 0FA0h=4000。
14)43-46:用象素/米表示的垂直解析度。A00F 0000為0000 0FA0h=4000。
15)47-50:點陣圖使用的顏色索引數。設為0的話,則說明使用所有調色板項。
16)51-54:對圖象顯示有重要影響的顏色索引的數目。如果是0,表示都重要。
彩色板
17)(55+0)到(50-1+2^biBitCount):彩色板規范。對於調色板中的每個表項,用下述方法來描述RGB的值:
1位元組用於藍色分量
1位元組用於綠色分量
1位元組用於紅色分量
1位元組用於填充符(設置為0)
對於24-位真彩色圖像就不使用彩色板,因為點陣圖中的RGB值就代表了每個象素的顏色。
如,彩色板為00F8 0000 E007 0000 1F00 0000 0000 0000,其中:
00F8為F800h = 1111 1000 0000 0000(二進制),是藍色分量的掩碼。
E007 為 07E0h = 0000 0111 1110 0000(二進制),是綠色分量的掩碼。
1F00為001Fh = 0000 0000 0001 1111(二進制),是紅色分量的掩碼。
0000 總設置為0。
將掩碼跟像素值進行「與」運算再進行移位操作就可以得到各色分量值。看看掩碼,就可以明白事實上在每個像素值的兩個位元組16位中,按從高到低取5、6、5位分別就是r、g、b分量值。取出分量值後把r、g、b值分別乘以8、4、8就可以補齊第個分量為一個位元組,再把這三個位元組按rgb組合,放入存儲器(同樣要反序),就可以轉換為24位標准BMP格式了。
圖像數據陣列
18)55(無調色板)-bfSize:每兩個位元組表示一個像素。陣列中的第一個位元組表示點陣圖左下角的象素,而最後一個位元組表示點陣圖右上角的象素。
//----圖像處理-----BMP為DIB類型,從底向上顯示---------
//陣列中的第一個位元組表示點陣圖左下角的象素,而最後一個位元組表示點陣圖右上角的象素。
//下面的代碼可以完成第一個位元組表示點陣圖左上角的象素,而最後一個位元組表示點陣圖右下角的象素,即正常的顯示狀態,便於操作。
int m,n;
unsigned char k;
m = BMPPIC.BMPInfoHead.biWidth/8; //24
n = BMPPIC.BMPInfoHead.biHeight; //96, 24*96 = 2304 bytes
for(int i=0; i < n/2; i++ )
{
for(int a=0; a < m; a++ )
{
k = pbufout1[m*(n-i-1) + a];
pbufout1[m*(n-i-1) + a] = pbufout1[i*m + a];
pbufout1[i*m + a] = k;
}
}
存儲演算法
BMP文件通常是不壓縮的,所以它們通常比同一幅圖像的壓縮圖像文件格式要大很多。例如,一個800×600的24位幾乎占據1.4MB空間。因此它們通常不適合在網際網路或者其它低速或者有容量限制的媒介上進行傳輸。根據顏色深度的不同,圖像上的一個像素可以用一個或者多個位元組表示,它由n/8所確定(n是位深度,1位元組包含8個數據位)。圖片瀏覽器等基於位元組的ASCII值計算像素的顏色,然後從調色板中讀出相應的值。更為詳細的信息請參閱下面關於點陣圖文件的部分。n位2n種顏色的點陣圖近似位元組數可以用下面的公式計算:BMP文件大小約等於 54+4*2的n次方+(w*h*n)/8,其中高度和寬度都是像素數。需要注意的是上面公式中的54是點陣圖文件的文件頭,是彩色調色板的大小。另外需要注意的是這是一個近似值,對於n位的點陣圖圖像來說,盡管可能有最多2n中顏色,一個特定的圖像可能並不會使用這些所有的顏色。由於彩色調色板僅僅定義了圖像所用的顏色,所以實際的彩色調色板將小於。如果想知道這些值是如何得到的,請參考下面文件格式的部分。由於存儲演算法本身決定的因素,根據幾個圖像參數的不同計算出的大小與實際的文件大小將會有一些細小的差別。
數據類型
Oracle產品 EPC Bitmap 中數據類型 EPC bitmap的縮寫。
Oracle提出了一種EPC bitmap的數據類型對基於RFID產品項級別跟蹤應用產生的大量的數據進行有效處理,。
EPC bitmap數據類型定義一個EPC集合,集合共享EPC的一些特徵(例如header,manager number,and object class)。支持這個數據類型的關鍵是使用RFID標識的物品項,在一個群組里可以基於共同屬性(例如位置,截止日期,或製造商),在通常情況下可以被追蹤。而EPC集合可以表示為一個EPC bitmap,bitmap可以被訪問並可通過epc2bmp或bmp2epc進行數據類型的轉換操作。
引入EPC bitmap(epc bmp)類型的好處:
(1)可以簡單的標識一個RFID EPC集合,而不會丟失任何信息;
(2)對於同類的EPC操作可以簡單的在bitmap上操作,簡化了操作方式