圖片的四種格式.jpg、.gif、.png,、.bmp各是什么意思? 以不同的格式保持文件會有什么不同呢,?效果有什么不同嗎,? 1.JPG格式是最常用的圖像文件格式,由一個軟件開發(fā)聯(lián)合會組織制定,,是一種有損壓縮格式,,能夠將圖像壓縮在很小的儲存空間,圖像中重復或不重要的資料會被丟失,,因此容易造成圖像數(shù)據(jù)的損傷,。尤其是使用過高的壓縮比例,將使最終解壓縮后恢復的圖像質量明顯降低,,如果追求高品質圖像,,不宜采用過高壓縮比例。 但是JPEG壓縮技術十分先進,,它用有損壓縮方式去除冗余的圖像數(shù)據(jù),,在獲得極高的壓縮率的同時能展現(xiàn)十分豐富生動的圖像,換句話說,,就是可以用最少的磁盤空間得到較好的圖像品質,。 而且JPEG是一種很靈活的格式,具有調節(jié)圖像質量的功能,,允許用不同的壓縮比例對文件進行壓縮,,支持多種壓縮級別,壓縮比率通常在10:1到40:1之間,,壓縮比越大,,品質就越低;相反地,,壓縮比越小,,品質就越好。比如可以把1.37Mb的BMP位圖文件壓縮至20.3KB,。當然也可以在圖像質量和文件尺寸之間找到平衡點,。 JPEG格式壓縮的主要是高頻信息,對色彩的信息保留較好,,適合應用于互聯(lián)網,,可減少圖像的傳輸時間,可以支持24bit真彩色,,也普遍應用于需要連續(xù)色調的圖像,。 2.GIF 是用于壓縮具有單調顏色和清晰細節(jié)的圖像(如線狀圖、徽標或帶文字的插圖)的標準格式。 GIF分為靜態(tài)GIF和動畫GIF兩種,,支持透明背景圖像,,適用于多種操作系統(tǒng),“體型”很小,,網上很多小動畫都是GIF格式,。其實GIF是將多幅圖像保存為一個圖像文件,從而形成動畫,所以歸根到底GIF仍然是圖片文件格式,。但GIF只能顯示256色,。 GIF主要分為兩個版本,即GIF GIF GIF GIF格式自1987年由CompuServe公司引入后,,因其體積小而成像相對清晰,特別適合于初期慢速的互聯(lián)網,,而從此大受歡迎,。它采用無損壓縮技術,只要圖像不多于256色,,則可既減少文件的大小,,又保持成像的質量。(當然,,現(xiàn)在也存在一些hack技術,,在一定的條件下克服256色的限制,具體參見真彩色)然而,,256色的限制大大局限了GIF文件的應用范圍,,如彩色相機等。(當然采用無損壓縮技術的彩色相機照片亦不適合通過網絡傳輸,。)另一方面,,在高彩圖片上有著不俗表現(xiàn)的JPG格式卻在簡單的折線上效果差強人意。因此GIF格式普遍適用于圖表,,按鈕等等只需少量顏色的圖像(如黑白照片),。 3.PNG是20世紀90年代中期開始開發(fā)的圖像文件存儲格式,其目的是企圖替代GIF和TIFF文件格式,,同時增加一些GIF文件格式所不具備的特性,。流式網絡圖形格式(Portable Network Graphic Format,PNG)名稱來源于非官方的“PNG's Not GIF”,是一種位圖文件(bitmap file)存儲格式,,讀成“ping”,。PNG用來存儲灰度圖像時,灰度圖像的深度可多到16位,,存儲彩色圖像時,,彩色圖像的深度可多到48位,并且還可存儲多到16位的α通道數(shù)據(jù),。PNG使用從LZ77派生的無損數(shù)據(jù)壓縮算法。 PNG圖片文件一般應用于JAVA程序中,,或網頁或S60程序中是因為它壓縮比高,,生成文件容量小。 使用彩色查找表或者叫做調色板可支持256種顏色的彩色圖像,。 流式讀/寫性能(streamability):圖像文件格式允許連續(xù)讀出和寫入圖像數(shù)據(jù),,這個特性很適合于在通信過程中生成和顯示圖像。 逐次逼近顯示(progressive display):這種特性可使在通信鏈路上傳輸圖像文件的同時就在終端上顯示圖像,,把整個輪廓顯示出來之后逐步顯示圖像的細節(jié),,也就是先用低分辨率顯示圖像,然后逐步提高它的分辨率,。 透明性(transparency):這個性能可使圖像中某些部分不顯示出來,,用來創(chuàng)建一些有特色的圖像。 輔助信息(ancillary information):這個特性可用來在圖像文件中存儲一些文本注釋信息,。 獨立于計算機軟硬件環(huán)境,。 使用無損壓縮。 PNG文件格式中要增加下列GIF文件格式所沒有的特性: 每個像素為48位的真彩色圖像,。 每個像素為16位的灰度圖像,。 可為灰度圖和真彩色圖添加α通道。 添加圖像的γ信息,。 使用循環(huán)冗余碼(cyclic redundancy code,,CRC)檢測損害的文件。 加快圖像顯示的逐次逼近顯示方式,。 標準的讀/寫工具包,。 可在一個文件中存儲多幅圖像。 4.BMP是一種與硬件設備無關的圖像文件格式,,使用非常廣,。它采用位映射存儲格式,除了圖像深度可選以外,,不采用其他任何壓縮,,因此,BMP文件所占用的空間很大。BMP文件的圖像深度可選lbit,、4bit,、8bit及24bit。BMP文件存儲數(shù)據(jù)時,,圖像的掃描方式是按從左到右,、從下到上的順序。 由于BMP文件格式是Windows環(huán)境中交換與圖有關的數(shù)據(jù)的一種標準,,因此在Windows環(huán)境中運行的圖形圖像軟件都支持BMP圖像格式,。 典型的BMP圖像文件由四部分組成: 1.位圖文件頭數(shù)據(jù)結構,它包含BMP圖像文件的類型,、顯示內容等信息,; 2.位圖信息數(shù)據(jù)結構,它包含有BMP圖像的寬,、高,、壓縮方法,以及定義顏色等信息,; 3.調色板,,這個部分是可選的,有些位圖需要調色板,,有些位圖,,比如真彩色圖(24位的BMP)就不需要調色板; 4.位圖數(shù)據(jù),,這部分的內容根據(jù)BMP位圖使用的位數(shù)不同而不同,,在24位圖中直接使用RGB,而其他的小于24位的使用調色板中顏色索引值,。 位圖的類型: 位圖一共有兩種類型,,即:設備相關位圖(DDB)和設備無關位圖(DIB)。DDB位圖在早期的Windows系統(tǒng)(Windows 3.0以前)中是很普遍的,,事實上它也是唯一的,。然而,隨著顯示器制造技術的進步,,以及顯示設備的多樣化,,DDB位圖的一些固有的問題開始浮現(xiàn)出來了。比如,,它不能夠存儲(或者說獲取)創(chuàng)建這張圖片的原始設備的分辨率,,這樣,應用程序就不能快速的判斷客戶機的顯示設備是否適合顯示這張圖片,。為了解決這一難題,,微軟創(chuàng)建了DIB位圖格式,。 設備無關位圖 (Device-Independent Bitmap) DIB位圖包含下列的顏色和尺寸信息: ▲原始設備(即創(chuàng)建圖片的設備)的顏色格式。 ▲原始設備的分辨率,。 ▲原始設備的調色板 ▲一個位數(shù)組,,由紅、綠,、藍(RGB)三個值代表一個像素,。 ▲一個數(shù)組壓縮標志,用于表明數(shù)據(jù)的壓縮方案(如果需要的話),。 以上這些信息保存在BITMAPINFO結構中,,該結構由BITMAPINFOHEADER結構和兩個或更多個RGBQUAD結構所組成。BITMAPINFOHEADER結構所包含的成員表明了圖像的尺寸,、原始設備的顏色格式,、以及數(shù)據(jù)壓縮方案等信息。RGBQUAD結構標識了像素所用到的顏色數(shù)據(jù),。 DIB位圖也有兩種形式,即:底到上型DIB(bottom-up),,和頂?shù)较滦虳IB(top-down),。底到上型DIB的原點(origin)在圖像的左下角,而頂?shù)较滦?SPAN lang=EN-US>DIB的原點在圖像的左上角,。如果DIB的高度值(由BITMAPINFOHEADER結構中的biHeight成員標識)是一個正值,,那么就表明這個DIB是一個底到上型DIB,如果高度值是一個負值,,那么它就是一個頂?shù)较滦?SPAN lang=EN-US>DIB,。注意:頂?shù)较滦偷腄IB位圖是不能被壓縮的。 位圖的顏色格式是通過顏色面板值(planes)和顏色位值(bitcount)計算得來的,,顏色面板值永遠是1,,而顏色位值則可以是1、4,、8,、16、24,、32其中的一個,。如果它是1,則表示位圖是一張單色位圖(譯者注:通常是黑白位圖,,只有黑和白兩種顏色,,當然它也可以是任意兩種指定的顏色),如果它是4,則表示這是一張VGA位圖,,如果它是8,、16,、24、或是32,,則表示該位圖是其他設備所產生的位圖,。如果應用程序想獲取當前顯示設備(或打印機)的顏色位值(或稱位深度),可調用API函數(shù)GetDeviceCaps(),,并將第二個參數(shù)設為BITSPIXEL即可,。 顯示設備的分辨率是以每米多少個像素來表明的,應用程序可以通過以下三個步驟來獲取顯示設備或打印機的水平分辨率: 1.調用GetDeviceCaps()函數(shù),,指定第二個參數(shù)為HORZRES,。 2.再次調用GetDeviceCaps()函數(shù),指定第二個參數(shù)為HORZSIZE,。 3.用第一個返回值除以第二個返回值,。即:DetDeviceCaps(hDC,HORZRES)/GetDeviceCaps(hDC,HORZSIZE); 應用程序也可以使用相同的三個步驟來獲取設備的垂直分辨率,,不同之處只是要將HORZRES替換為VERTRES,,把HORZSIZE替換為VERTSIZE,即可,。 調色板是被保存在一個RGBQUAD結構的數(shù)組中,,該結構指出了每一種顏色的紅、綠,、藍的分量值,。位數(shù)組中的每一個索引都對應于一個調色板項(即一個RGBQUAD結構),應用程序將根據(jù)這種對應關系,,將像素索引值轉換為像素RGB值(真實的像素顏色),。應用程序也可以通過調用GetDeviceCaps()函數(shù)來獲取當前顯示設備的調色板尺寸(將該函數(shù)的第二個參數(shù)設為NUMCOLORS即可)。 Win32 API支持位數(shù)據(jù)的壓縮(只對8位和4位的底到上型DIB位圖),。壓縮方法是采用運行長度編碼方案(RLE),,RLE使用兩個字節(jié)來描述一個句法,第一個字節(jié)表示重復像素的個數(shù),,第二個字節(jié)表示重復像素的索引值,。有關壓縮位圖的詳細信息請參見對BITMAPINFOHEADER結構的解釋。 應用程序可以從一個DDB位圖創(chuàng)建出一個DIB位圖,,步驟是,,先初始化一些必要的結構,然后再調用GetDIBits()函數(shù),。不過,,有些顯示設備有可能不支持這個函數(shù),你可以通過調用GetDeviceCaps()函數(shù)來確定一下(GetDeviceCaps()函數(shù)在調用時指定RC_DI_BITMAP作為RASTERCAPS的標志),。 應用程序可以用DIB去設置顯示設備上的像素(譯者注:也就是顯示DIB),,方法是調用SetDIBitsToDevice()函數(shù)或調用StretchDIBits()函數(shù),。同樣,有些顯示設備也有可能不支持以上這兩個函數(shù),,這時你可以指定RC_DIBTODEV作為RASTERCAPS標志,,然后調用GetDeviceCaps()函數(shù)來判斷該設備是否支持SetDIBitsToDevice()函數(shù)。也可以指定RC_STRETCHDIB作為RASTERCAPS標志來調用GetDeviceCaps()函數(shù),,來判斷該設備是否支持StretchDIBits()函數(shù),。 如果應用程序只是要簡單的顯示一個已經存在的DIB位圖,那么它只要調用SetDIBitsToDevice()函數(shù)就可以,。比如一個電子表格軟件,,它可以打開一個圖表文件,在窗口中簡單的調用SetDIBitsToDevice()函數(shù),,將圖形顯示在窗口中,。但如果應用程序要重復的繪制位圖的話,則應該使用BitBlt()函數(shù),,因為BitBlt()函數(shù)的執(zhí)行速度要比SetDIBitsToDevice()函數(shù)快很多,。 設備相關位圖(Device-Dependent Bitmaps) 設備相關位圖(DDB)之所以現(xiàn)在還被系統(tǒng)支持,只是為了兼容舊的Windows 3.0軟件,,如果程序員現(xiàn)在要開發(fā)一個與位圖有關的程序,,則應該盡量使用或生成DIB格式的位圖。 DDB位圖是被一個單個結構BITMAP所描述,,這個結構的成員標明了該位圖的寬度、高度,、設備的顏色格式等信息,。 DDB位圖也有兩種類型,即:可廢棄的(discardable)DDB和不可廢棄的(nondiscardable)DDB,??蓮U棄的DDB位圖就是一種當系統(tǒng)內存缺乏,并且該位圖也沒有被選入設備描述表(DC)的時候,,系統(tǒng)就會把該DDB位圖從內存中清除(即廢棄),。不可廢棄的DDB則是無論系統(tǒng)內存多少都不會被系統(tǒng)清除的DDB。API函數(shù)CreateDiscardableBitmap()函數(shù)可用于創(chuàng)建可廢棄位圖,。而函數(shù)CreateBitmap(),、CreateCompatibleBitmap()、和CreateBitmapIndirect()可用于創(chuàng)建不可廢棄的位圖,。 應用程序可以通過一個DIB位圖而創(chuàng)建一個DDB位圖,,只要先初始化一些必要的結構,然后再調用CreateDIBitmap()函數(shù)就可以,。如果在調用該函數(shù)時指定了CBM_INIT標志,,那么這一次調用就等價于先調用CreateCompatibleBitmap()創(chuàng)建當前設備格式的DDB位圖,,然后又調用SetDIBits()函數(shù)轉換DIB格式到DDB格式。(可能有些設備并不支持SetDIBits()函數(shù),,你可以指定RC_DI_BITMAP作為RASTERCAPS的標志,,然后調用GetDeviceCaps()函數(shù)來判斷一下)。 對應的數(shù)據(jù)結構: 1.BMP文件組成 BMP文件由文件頭,、位圖信息頭,、顏色信息和圖形數(shù)據(jù)四部分組成。 2.BMP文件頭(14字節(jié)) BMP文件頭數(shù)據(jù)結構含有BMP文件的類型,、文件大小和位圖起始位置等信息,。 其結構定義如下: typedef struct tagBITMAPFILEHEADER { WORDbf Type;//位圖文件的類型,必須為BM(0-1字節(jié)) DWORD bfSize;//位圖文件的大小,,以字節(jié)為單位(2-5字節(jié)) WORD bfReserved1;//位圖文件保留字,,必須為0(6-7字節(jié)) WORD bfReserved2;//位圖文件保留字,必須為0(8-9字節(jié)) DWORD bfOffBits;//位圖數(shù)據(jù)的起始位置,,以相對于位圖(10-13字節(jié)) //文件頭的偏移量表示,,以字節(jié)為單位 }BITMAPFILEHEADER; 3.位圖信息頭(40字節(jié)) BMP位圖信息頭數(shù)據(jù)用于說明位圖的尺寸等信息。 typedef struct tagBITMAPINFOHEADER{ DWORD biSize;//本結構所占用字節(jié)數(shù)(14-17字節(jié)) LONG biWidth;//位圖的寬度,,以像素為單位(18-21字節(jié)) LONG biHeight;//位圖的高度,,以像素為單位(22-25字節(jié)) WORD biPlanes;//目標設備的級別,必須為1(26-27字節(jié)) WORD biBitCount;//每個像素所需的位數(shù),,必須是1(雙色),(28-29字節(jié)) //4(16色),,8(256色)或24(真彩色)之一 DWORD biCompression;//位圖壓縮類型,必須是 0(不壓縮),(30-33字節(jié)) //1(BI_RLE8壓縮類型)或2(BI_RLE4壓縮類型)之一 DWORD biSizeImage;//位圖的大小,,以字節(jié)為單位(34-37字節(jié)) LONG biXPelsPerMeter;//位圖水平分辨率,,每米像素數(shù)(38-41字節(jié)) LONG biYPelsPerMeter;//位圖垂直分辨率,每米像素數(shù)(42-45字節(jié)) DWORD biClrUsed;//位圖實際使用的顏色表中的顏色數(shù)(46-49字節(jié)) DWORD biClrImportant;//位圖顯示過程中重要的顏色數(shù)(50-53字節(jié)) }BITMAPINFOHEADER; 4:顏色表 顏色表用于說明位圖中的顏色,,它有若干個表項,,每一個表項是一個RGBQUAD類型的結構,定義一種顏色,。RGBQUAD結構的定義如下: typedef struct tagRGBQUAD{ BYTE rgbBlue;//藍色的亮度(值范圍為0-255) BYTE rgbGreen;//綠色的亮度(值范圍為0-255) BYTE rgbRed;//紅色的亮度(值范圍為0-255) BYTE rgbReserved;//保留,,必須為0 }RGBQUAD; 顏色表中RGBQUAD結構數(shù)據(jù)的個數(shù)有biBitCount來確定: 當biBitCount=1,4,8時,分別有2,16,256個表項; 當biBitCount=24時,,沒有顏色表項,。 位圖信息頭和顏色表組成位圖信息,BITMAPINFO結構定義如下: typedef struct tagBITMAPINFO{ BITMAPINFOHEADER bmiHeader;//位圖信息頭 RGBQUAD bmiColors[1];//顏色表 }BITMAPINFO; 5:位圖數(shù)據(jù) 位圖數(shù)據(jù)記錄了位圖的每一個像素值,,記錄順序是在掃描行內是從左到右,掃描行之間是從下到上,。位圖的一個像素值所占的字節(jié)數(shù): 當biBitCount=1時,8個像素占1個字節(jié); 當biBitCount=4時,,2個像素占1個字節(jié); 當biBitCount=8時,,1個像素占1個字節(jié); 當biBitCount=24時,1個像素占3個字節(jié); Windows規(guī)定一個掃描行所占的字節(jié)數(shù)必須是 4的倍數(shù)(即以long為單位),不足的以0填充,, biSizeImage = ((((bi.biWidth * bi.biBitCount) + 31) &~31)/8)* bi.biHeight; 具體數(shù)據(jù)舉例: 如某BMP文件開頭: 4D42 4690 0000 0000 0000 4600 0000 2800 0000 8000 0000 9000 0000 0100*1000 0300 0000 0090 BMP文件可分為四個部分:位圖文件頭、位圖信息頭,、彩色板,、圖像數(shù)據(jù)陣列,在上圖中已用*分隔,。 一,、圖像文件頭 1)1:(這里的數(shù)字代表的是"字",即兩個字節(jié),下同)圖像文件頭。0x4D42=’BM’,,表示是Windows支持的BMP格式,。 2)2-3:整個文件大小。4690 0000,,為00009046h=36934,。 3)4-5:保留,必須設置為0,。 4)6-7:從文件開始到位圖數(shù)據(jù)之間的偏移量,。4600 0000,為00000046h=70,,上面的文件頭就是35字=70字節(jié),。 二、位圖信息頭 5)8-9:位圖圖信息頭長度,。 6)10-11:位圖寬度,,以像素為單位。8000 0000,,為00000080h=128,。 7)12-13:位圖高度,以像素為單位,。9000 0000,為00000090h=144,。 8)14:位圖的位面數(shù),,該值總是1。0100,,為0001h=1,。 9)15:每個像素的位數(shù)。有1(單色),,4(16色),,8(256色),16(64K色,,高彩色),,24( 10)16-17:壓縮說明:有0(不壓縮),,1(RLE 8,,8位RLE壓縮),2(RLE 4,,4位RLE壓縮,,3(Bitfields,位域存放),。RLE簡單地說是采用像素數(shù)+像素值的方式進行壓縮,。T408采用的是位域存放方式,用兩個字節(jié)表示一個像素,,位域分配為r5b 11)18-19:用字節(jié)數(shù)表示的位圖數(shù)據(jù)的大小,,該數(shù)必須是4的倍數(shù),,數(shù)值上等于(≥位圖寬度的最小的4的倍數(shù))×位圖高度×每個像素位數(shù)。0090 0000為00009000h=80×90×2h=36864,。 12)20-21:用象素/米表示的水平分辨率,。A 13)22-23:用象素/米表示的垂直分辨率,。A 14)24-25:位圖使用的顏色索引數(shù)。設為0的話,,則說明使用所有調色板項,。 15)26-27:對圖象顯示有重要影響的顏色索引的數(shù)目。如果是0,,表示都重要,。 三、彩色板 16)28-....(不確定):彩色板規(guī)范,。對于調色板中的每個表項,,用下述方法來描述RGB的值: 1字節(jié)用于藍色分量 1字節(jié)用于綠色分量 1字節(jié)用于紅色分量 1字節(jié)用于填充符(設置為0) 對于24-位真彩色圖像就不使用彩色板,因為位圖中的RGB值就代表了每個象素的顏色,。 如,,彩色板為 00FB 0000為FB00h=1111100000000000(二進制),是藍色分量的掩碼,。 E007 0000為 07E0h=0000011111100000(二進制),,是綠色分量的掩碼。 0000 0000總設置為0。 將掩碼跟像素值進行“與”運算再進行移位操作就可以得到各色分量值,??纯囱诖a,就可以明白事實上在每個像素值的兩個字節(jié)16位中,,按從高到低取5,、6、5位分別就是r,、g,、b分量值。取出分量值后把r,、g,、b值分別乘以8、4,、8就可以補齊第個分量為一個字節(jié),,再把這三個字節(jié)按rgb組合,放入存儲器(同樣要反序),,就可以轉換為24位標準BMP格式了,。 四、圖像數(shù)據(jù)陣列 17)27(無調色板)-...:每兩個字節(jié)表示一個像素,。陣列中的第一個字節(jié)表示位圖左下角的象素,,而最后一個字節(jié)表示位圖右上角的象素。 五,、存儲算法 BMP文件通常是不壓縮的,,所以它們通常比同一幅圖像的壓縮圖像文件格式要大很多。例如,,一個800×600的24位幾乎占據(jù)1.4MB空間,。因此它們通常不適合在因特網或者其它低速或者有容量限制的媒介上進行傳輸。根據(jù)顏色深度的不同,,圖像上的一個像素可以用一個或者多個字節(jié)表示,,它由n/8所確定(n是位深度,,1字節(jié)包含8個數(shù)據(jù)位),。圖片瀏覽器等基于字節(jié)的ASCII值計算像素的顏色,然后從調色板中讀出相應的值。更為詳細的信息請參閱下面關于位圖文件的部分,。n位2n種顏色的位圖近似字節(jié)數(shù)可以用下面的公式計算:BMP文件大小約等于 54+4*2的n次方+(w*h*n)/8,,其中高度和寬度都是像素數(shù)。 需要注意的是上面公式中的54是位圖文件的文件頭,,是彩色調色板的大小,。另外需要注意的是這是一個近似值,對于n位的位圖圖像來說,,盡管可能有最多2n中顏色,,一個特定的圖像可能并不會使用這些所有的顏色。由于彩色調色板僅僅定義了圖像所用的顏色,,所以實際的彩色調色板將小于,。如果想知道這些值是如何得到的,請參考下面文件格式的部分,。 由于存儲算法本身決定的因素,,根據(jù)幾個圖像參數(shù)的不同計算出的大小與實際的文件大小將會有一些細小的差別。 |
|