當前位置:編程學習大全網 - 編程語言 - 圖片格式jpg、gif、jpeg、png,bmp分別是什麽意思,?

圖片格式jpg、gif、jpeg、png,bmp分別是什麽意思,?

JPG格式是最常用的圖像文件格式,由壹個軟件開發聯合會組織制定,是壹種有損壓縮格式,能夠將圖像壓縮在很小的儲存空間,圖像中重復或不重要的資料會被丟失,因此容易造成圖像數據的損傷。尤其是使用過高的壓縮比例,將使最終解壓縮後恢復的圖像質量明顯降低,

如果追求高品質圖像,不宜采用過高壓縮比例。

但是JPEG壓縮技術十分先進,它用有損壓縮方式去除冗余的圖像數據,在獲得極高的壓縮率的同時能展現十分豐富生動的圖像,換句話說,就是可以用最少的磁盤空間得到較好的圖像品質。

而且JPEG是壹種很靈活的格式,具有調節圖像質量的功能,允許用不同的壓縮比例對文件進行壓縮,支持多種壓縮級別,壓縮比率通常在10:1到40:1之間,壓縮比越大,品質就越低;相反地,壓縮比越小,品質就越好。比如可以把1.37Mb的BMP位圖文件壓縮至20.3KB。當然也可以在圖像質量和文件尺寸之間找到平衡點。

JPEG格式壓縮的主要是高頻信息,對色彩的信息保留較好,適合應用於互聯網,可減少圖像的傳輸時間,可以支持24bit真彩色,也普遍應用於需要連續色調的圖像。

GIF 是用於壓縮具有單調顏色和清晰細節的圖像(如線狀圖、徽標或帶文字的插圖)的標準格式。

GIF分為靜態GIF和動畫GIF兩種,支持透明背景圖像,適用於多種操作系統,“體型”很小,網上很多小動畫都是GIF格式。其實GIF是將多幅圖像保存為壹個圖像文件,從而形成動畫,所以歸根到底GIF仍然是圖片文件格式。但GIF只能顯示256色。

GIF主要分為兩個版本,即GIF 89a和GIF 87a:

GIF 87a:是在1987年制定的版本

GIF 89a:是1989年制定的版本。在這個版本中,為GIF文檔擴充了圖形控制區塊、備註、說明、應用程序編程接口等四個區塊,並提供了對透明色和多幀動畫的支持

GIF格式自1987年由CompuServe公司引入後,因其體積小而成像相對清晰,特別適合於初期慢速的互聯網,而從此大受歡迎。它采用無損壓縮技術,只要圖像不多於256色,則可既減少文件的大小,又保持成像的質量。(當然,現在也存在壹些hack技術,在壹定的條件下克服256色的限制,具體參見真彩色)然而,256色的限制大大局限了GIF文件的應用範圍,如彩色相機等。(當然采用無損壓縮技術的彩色相機照片亦不適合通過網絡傳輸。)另壹方面,在高彩圖片上有著不俗表現的JPG格式卻在簡單的折線上效果差強人意。因此GIF格式普遍適用於圖表,按鈕等等只需少量顏色的圖像(如黑白照片)。

PNG是20世紀90年代中期開始開發的圖像文件存儲格式,其目的是企圖替代GIF和TIFF文件格式,同時增加壹些GIF文件格式所不具備的特性。流式網絡圖形格式(Portable Network Graphic Format,PNG)名稱來源於非官方的“PNG's Not GIF”,是壹種位圖文件(bitmap file)存儲格式,讀成“ping”。PNG用來存儲灰度圖像時,灰度圖像的深度可多到16位,存儲彩色圖像時,彩色圖像的深度可多到48位,並且還可存儲多到16位的α通道數據。PNG使用從LZ77派生的無損數據壓縮算法。

PNG圖片文件壹般應用於JAVA程序中,或網頁或S60程序中是因為它壓縮比高,生成文件容量小。

使用彩色查找表或者叫做調色板可支持256種顏色的彩色圖像。

流式讀/寫性能(streamability):圖像文件格式允許連續讀出和寫入圖像數據,這個特性很適合於在通信過程中生成和顯示圖像。

逐次逼近顯示(progressive display):這種特性可使在通信鏈路上傳輸圖像文件的同時就在終端上顯示圖像,把整個輪廓顯示出來之後逐步顯示圖像的細節,也就是先用低分辨率顯示圖像,然後逐步提高它的分辨率。

透明性(transparency):這個性能可使圖像中某些部分不顯示出來,用來創建壹些有特色的圖像。

輔助信息(ancillary information):這個特性可用來在圖像文件中存儲壹些文本註釋信息。

獨立於計算機軟硬件環境。

使用無損壓縮。

PNG文件格式中要增加下列GIF文件格式所沒有的特性:

每個像素為48位的真彩色圖像。

每個像素為16位的灰度圖像。

可為灰度圖和真彩色圖添加α通道。

添加圖像的γ信息。

使用循環冗余碼(cyclic redundancy code,CRC)檢測損害的文件。

加快圖像顯示的逐次逼近顯示方式。

標準的讀/寫工具包。

可在壹個文件中存儲多幅圖像。

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

{

WORDbf Type; // 位圖文件的類型,必須為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文件可分為四個部分:位圖文件頭、位圖信息頭、彩色板、圖像數據陣列,在上圖中已用*分隔。

壹、圖像文件頭

1)1:(這裏的數字代表的是"字",即兩個字節,下同)圖像文件頭。0x4D42=’BM’,表示是Windows支持的BMP格式。

2)2-3:整個文件大小。4690 0000,為00009046h=36934。

3)4-5:保留,必須設置為0。

4)6-7:從文件開始到位圖數據之間的偏移量。4600 0000,為00000046h=70,上面的文件頭就是35字=70字節。

二、位圖信息頭

5)8-9:位圖圖信息頭長度。

6)10-11:位圖寬度,以像素為單位。8000 0000,為00000080h=128。

7)12-13:位圖高度,以像素為單位。9000 0000,為00000090h=144。

8)14:位圖的位面數,該值總是1。0100,為0001h=1。

9)15:每個像素的位數。有1(單色),4(16色),8(256色),16(64K色,高彩色),24(16M色,真彩色),32(4096M色,增強型真彩色)。1000為0010h=16。

10)16-17:壓縮說明:有0(不壓縮),1(RLE 8,8位RLE壓縮),2(RLE 4,4位RLE壓縮,3(Bitfields,位域存放)。RLE簡單地說是采用像素數+像素值的方式進行壓縮。T408采用的是位域存放方式,用兩個字節表示壹個像素,位域分配為r5b6g5。圖中0300 0000為00000003h=3。

11)18-19:用字節數表示的位圖數據的大小,該數必須是4的倍數,數值上等於(≥位圖寬度的最小的4的倍數)×位圖高度×每個像素位數。0090 0000為00009000h=80×90×2h=36864。

12)20-21:用象素/米表示的水平分辨率。A00F 0000為0000 0FA0h=4000。

13)22-23:用象素/米表示的垂直分辨率。A00F 0000為0000 0FA0h=4000。

14)24-25:位圖使用的顏色索引數。設為0的話,則說明使用所有調色板項。

15)26-27:對圖象顯示有重要影響的顏色索引的數目。如果是0,表示都重要。

三、彩色板

16)28-....(不確定):彩色板規範。對於調色板中的每個表項,用下述方法來描述RGB的值:

1字節用於藍色分量

1字節用於綠色分量

1字節用於紅色分量

1字節用於填充符(設置為0)

對於24-位真彩色圖像就不使用彩色板,因為位圖中的RGB值就代表了每個象素的顏色。

如,彩色板為00F8 0000 E007 0000 1F00 0000 0000 0000,其中:

00FB 0000為FB00h=1111100000000000(二進制),是藍色分量的掩碼。

E007 0000為 07E0h=0000011111100000(二進制),是綠色分量的掩碼。

1F00 0000為001Fh=0000000000011111(二進制),是紅色分量的掩碼。

0000 0000總設置為0。

將掩碼跟像素值進行“與”運算再進行移位操作就可以得到各色分量值。看看掩碼,就可以明白事實上在每個像素值的兩個字節16位中,按從高到低取5、6、5位分別就是r、g、b分量值。取出分量值後把r、g、b值分別乘以8、4、8就可以補齊第個分量為壹個字節,再把這三個字節按rgb組合,放入存儲器(同樣要反序),就可以轉換為24位標準BMP格式了。

四、圖像數據陣列

17)27(無調色板)-...:每兩個字節表示壹個像素。陣列中的第壹個字節表示位圖左下角的象素,而最後壹個字節表示位圖右上角的象素。

五、存儲算法

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中顏色,壹個特定的圖像可能並不會使用這些所有的顏色。由於彩色調色板僅僅定義了圖像所用的顏色,所以實際的彩色調色板將小於。 如果想知道這些值是如何得到的,請參考下面文件格式的部分。 由於存儲算法本身決定的因素,根據幾個圖像參數的不同計算出的大小與實際的文件大小將會有壹些細小的差別。

  • 上一篇:媽媽的愛周記
  • 下一篇:如何在深度系統上安裝和使用深度學習相關的軟件和工具
  • copyright 2024編程學習大全網