BMP檔案處理

2022-12-25 04:54:06 字數 5000 閱讀 9262

點陣圖和bitblt

點陣圖是乙個二維的位陣列,此陣列的每乙個元素與影象的畫素一一對應。現實世界的影象**獲以後,影象被分割成網格,並以畫素作為取樣單位。點陣圖中的每個畫素值指明了乙個單位網格內影象的平均顏色。

位圖代表了windows程式中儲存影象資訊的兩種方法之一,另一種形式是元檔案。

點陣圖也有兩種:gdi點陣圖物件和裝置無關的點陣圖(dib: device-independent bitmap)。

位圖基礎

位圖常用來表示來自真實世界的複雜影象,元檔案更適合於描述由人或者機器生成的影象。它們都能存於記憶體或作為檔案存於磁碟上,且能通過剪貼簿在windows應用程式間傳輸。

點陣圖和元檔案的區別在於光柵影象和向量影象間的差別。光柵影象用離散的畫素來處理輸出裝置;向量影象用笛卡爾座標系統來處理輸出裝置,可在其中繪製線和填充物件。

點陣圖的缺點:1、容易受裝置依賴性的影響。2、點陣圖常暗示了特定的顯示解析度和影象縱橫比,在縮放後容易出現失真。3、儲存空間大。

但位圖具有處理速度快的優點。

位圖可以手工建立,也可計算機**生成,還可由硬體裝置把現實世界輸入到計算機,如數位相機,它們通常是使用接觸到光就釋放電荷的電荷耦合裝置(ccd: charge-coupled device)將光的強度轉換為電荷,再用模數轉換裝置(adc: analog-to-digital)轉換為數字再排列為位圖。

位圖尺寸

點陣圖呈矩形,具有空間尺寸,以畫素為單位度量點陣圖的高度和寬度。以位於影象左上角為位圖原點,從0開始計數。

點陣圖的空間尺寸也指定了其解析度,但此詞具有爭議,解析度也指單位長度內的畫素數。

點陣圖是矩形的,但記憶體是線性的。大多數點陣圖按行儲存在記憶體中,且從頂行畫素開始從左到右直到底行結束。

位圖還有顏色度量單位:指每個畫素所需要的位數,也稱顏色深度(color depth)、位數(bit-count)、或位/每畫素(bpp: bits per pixel)。

每個畫素用1位來描述的點陣圖稱為二級(bilevel)、二色(bicolor)或單色(monochrome)位圖。每個畫素也可用多位來描述,可以表示的顏色數等於2的i次方(i為位數)。

如何將顏色位的組合與人們所熟識的顏色相對應是處理點陣圖時經常出現的問題。

位塊傳送

一、bitblt函式:原樣複製

整個**顯示器可看作是一幅大位圖,其上的畫素由儲存在**顯示適配卡上記憶體中的位來描述。所以,我們可以使用bitblt函式來完成將影象從**顯示的乙個區域複製到另乙個區域。這就是位塊傳送(bit-block tranfer)。

此函式是畫素移動程式,實際上對畫素執行了一次位運算操作。

bitblt函式從稱為「源」的裝置描述表中將乙個矩形區的畫素傳送到稱為「目標」的另乙個裝置描述表中相同大小的矩形區。源和目標裝置描述表可以相同。此函式語法如下:

bitblt(hdcdst,xdst,ydst,cx,cy,hdcsrc,xsrc,ysrc,dwrop);

xsrc和ysrc引數指明了源影象左上角在源裝置描述表中的座標位置。cx和cy是影象的寬度和高度。xdst和ydst是影象複製到的裝置描述表中的座標位置。

dwrop是光柵操作符。

注意:bitblt是從實際**顯示記憶體傳送畫素,也就是說整個顯示屏上的影象都存於視訊記憶體中,若影象超出了顯示屏,那麼bitblt只傳送在顯示屏上的部分。

bitblt的最大限制是兩個裝置描述表必須相容,就是說兩者的每個畫素都具有相同的位數。所以,不能用它將螢幕上的某些圖形複製到印表機。

二、stretchblt函式:拉伸位圖

此函式語法如下:stretchblt(hdcdst,xdst,ydst,cxdst,cydst,

hdcsrc,xsrc,ysrc,cxsrc,cysrc,dwrop);

bitblt和stretchblt函式中所有的座標與大小都是基於邏輯單位的。但如果bitblt函式中有兩個不同的裝置描述表,而這兩個裝置描述表引用相同的物理裝置卻具有不同的對映模式時,bitblt就不明確了:cx和cy都是邏輯單位,它們同樣應用於源裝置描述表和目標裝置描述表中的矩形區。

此時,所有的座標和尺寸必須在實際的位傳送之前轉換為裝置座標。cx和cy同時用於源和目標裝置描述表,所以必須分別轉換為裝置描述表自己的單位。(?

)三、patblt函式:繪製填充圖形

語法如下:patblt(hdc,x,y,cx,cy,dwrop);

gdi點陣圖物件:也稱為裝置相關位圖或者ddb

一、 建立ddb

ddb是windows圖形裝置介面的圖形物件之一(其中還包括畫筆、畫刷、字型、元檔案和調色盤)。這些圖形物件儲存在gdi模式內部,由應用程式軟體的數字控制代碼引用。用hbitmap型別的變數儲存ddb控制代碼:

hbitmap hbitmap。然後通過呼叫某個建立ddb的函式來獲得控制代碼,這有三個函式。這些函式分配並初始化gdi記憶體中的一些記憶體來儲存關於點陣圖的資訊,以及實際點陣圖的位資訊。

應用程式不能直接訪問這段記憶體。點陣圖與裝置描述表無關。程式使用完位圖以後,就清除這段記憶體:

deleteobject(hbitmap);

三個函式:

createbitmap(cx,cy,cplanes,cbitspixel,bits);

createcompatiblebitmap(hdc,cx,cy);建立乙個與裝置相容的點陣圖。

createbitmapindirect(&bitmap);bitmap是bitmap型別的結構。

二、點陣圖位

獲得和設定畫素位:

getbitmapbits(hbitmap,cbytes,&bits);

setbitmapbits(hbitmap,cbytes,&bits);

cbytes指明要複製的位元組數,bits是其大小至少為cbytes的緩衝區。

畫素實際上並不涉及任何固定的顏色,它只是乙個值,與在**板上的調色盤查詢表是的索引值有關。

基本的規則:不要用createbitmap、createbitmapindirect或setbitmapbits來設定彩色ddb的位,只能安全地設定單色ddb的位。

三、記憶體裝置描述表

裝置描述表指的是某個圖形輸出裝置(如顯示器或印表機),及其裝置驅動程式。

記憶體裝置描述表只位於記憶體中,它不是真正的圖形輸出裝置,但可以說與某個實際裝置「相容」。在有某個實際裝置的裝置描述表之後,就可以建立記憶體裝置描述表:

hdcmem=createcompatibledc(hdc);

如果其引數為null,則建立乙個與顯示器相相容的記憶體裝置描述表。最後用deletedc來清除。

記憶體裝置描述表有乙個與實際光柵裝置相同的、單色、1畫素寬、1畫素高的顯示表面。然後,通過將乙個gdi點陣圖物件選進記憶體裝置描述表來完成擴大顯示表面的工作:selectobject(hdcmem,hbitmap);

記憶體裝置描述表是唯一一種可以選進製圖的裝置描述表。selectobject呼叫以後,ddb就是記憶體裝置描述表的顯示表面。可以在其上進行各種處理實際裝置描述表的每項操作。

批註:記憶體裝置描述表實際上提供了一種在記憶體和顯示器間進行位圖傳送的方法。

四、載入位圖資源

也可用loadbitmap函式來獲得gdi點陣圖物件控制代碼。

五、單色位圖格式

對於單色位圖,可以用乙個位元組陣列來描述點陣圖中的各個畫素。

先用bitmap結構來定義點陣圖的資訊,再用byte型別的陣列來定義各個畫素定義的各個位,最後用createbitmap、createbitmapindirect來建立位圖。

與裝置無關的點陣圖

ddb的位格式高度依賴於裝置,所以它不適用於影象交換。ddb內沒有色彩表來指定點陣圖的位與色彩之間的聯絡,它僅當在windows會話的生存期內被建立和清除時才有意義。

裝置無關的點陣圖(dib)提供了適用於交換的影象檔案格式。dib內的點陣圖幾乎沒有被壓縮,適用於在程式中直接操作。如果在記憶體中有dib,就可以提供指向該dib的指標作為某些函式的引數,來顯示dib或把dib轉化為ddb。

dib檔案格式

dib作為一種檔案格式,它的擴充套件名為.bmp,在極少數的情況下為.dib。windows使用的點陣圖影象被當作dib檔案建立,並作為唯讀資源儲存在程式的可執行檔案中。

程式能將dib檔案減去前14個位元組載入到連續的記憶體塊中形成「緊縮dib(packed-dib)格式的點陣圖」。程式可以使用緊縮dib格式,通過windows剪帖板來交換影象或建立畫刷,也或完全訪問dib的內容,並以任意方式修改dib。

一、 os/2風格的dib

dib檔案有4個主要的部分:

檔案頭、資訊頭、rgb色彩表(不一定有)和位影象素位。

前兩部分保看成是一種c的資料結構,第三部分是資料結構的陣列。

對記憶體中緊縮的dib格式只有3個部分,就是缺少檔案頭。

dib檔案以14個位元組的bitmapfileheader結構的檔案頭開始,指出了檔案的型別、檔案大小及畫素位的偏移量;此後是12個位元組的bitmapcoreheader結構,指出了dib的大小及每畫素的位數。

bitmapcoreheader結構中的bcbitcount欄位一般為1、4、8或24,分別對應2色、16色、256色和全色的dib。對於前三種bitmapcoreheader後緊跟色彩表,對24位dib,則無色彩表。

色彩表是乙個rgbtriple結構(此結構每個為3位元組大小)的陣列,陣列中的每個元素代表影象中的每種顏色(指這種影象由多少種顏色來描述,如8點陣圖就有256種顏色,這256種顏色就由這個陣列的各個元素來指定,這個陣列的大小就是256)。

二、從下向上

dib中的畫素位是按水平行組織的,常稱「掃瞄線」。行數為bitmapcoreheader結構中的bcheight欄位。但dib從影象的底行開始,從下往上掃過影象。

所以,在dib中,影象的底行是檔案的第一行,影象的頂行是檔案的最後一行。這個檔案的第一行指的是dib檔案的色彩表後的位影象素位的第乙個畫素行,最後一行是位影象素位的最後一行。

三、dib畫素位

dib檔案的最後部分由實際的dib的畫素位組成。畫素位是由從影象的底行開始,並沿著影象向上增長的水平行組織的。dib中的行數為bitmapcoreheader結構的bcheight欄位,每行的畫素數為該結構的bcwidth欄位。

每行從最左邊的畫素數開始,直到影象的右邊。每個畫素的位數可以從bcbitcount欄位獲取,為1、4、8或24。

1位dib:每位元組為8畫素,最左邊的畫素是第乙個位元組的最高位,色彩表中有2項。

BMP是什麼檔案

說起bmp,也許大家都不會陌生了,我們電腦中儲存的很多檔案都是這個格式的,很多朋友或許知道bmp是圖形問價,但bmp檔案具體又是什麼呢?接下來我們來了解一下。bmp是什麼檔案 bmp 全稱bitmap 是windows作業系統中的標準影象檔案格式,可以分成兩類 裝置相關位圖 ddb 和裝置無關位圖 ...

BMP檔案格式詳解

bmp檔案格式,又稱為bitmap 位圖 或是dib device independent device,裝置無關位圖 是windows系統中廣泛使用的影象檔案格式。由於它可以不作任何變換地儲存影象畫素域的資料,因此成為我們取得raw 資料的重要 windows的圖形使用者介面 graphical ...

檔案的處理

檔案的處理 你總會用得上 一 紅標頭檔案的製作及標準1 進行頁面設臵 選擇 檔案 頁面設臵 選擇 頁邊距 附籤,上 3.7厘公尺下 3.5厘公尺左 2.8厘公尺右 2.6厘公尺。選擇 版式 附籤,將 頁首和頁尾 設臵成 奇偶頁不同 在該選項前打 選擇 文件網格 附籤,字型設臵 中文字型 設臵為 仿宋...