畢業(yè)設計(論文)基于MFC的圖片瀏覽器的設計與實現(xiàn)_第1頁
畢業(yè)設計(論文)基于MFC的圖片瀏覽器的設計與實現(xiàn)_第2頁
畢業(yè)設計(論文)基于MFC的圖片瀏覽器的設計與實現(xiàn)_第3頁
畢業(yè)設計(論文)基于MFC的圖片瀏覽器的設計與實現(xiàn)_第4頁
畢業(yè)設計(論文)基于MFC的圖片瀏覽器的設計與實現(xiàn)_第5頁
已閱讀5頁,還剩53頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

1、第1章 緒 論圖像處理源自于二戰(zhàn)中的攝影偵察。當時,處理操作是通過光學方法來完成的,判讀工作則是由專門精于此道并能確定炸彈襲擊結果的人員來做。隨著20世紀60年代后期衛(wèi)星圖像的出現(xiàn),更多基于計算機的工作便開展起來。彩色合成的衛(wèi)星圖像,有時的確漂亮的讓人吃驚,它們已經(jīng)成為人類視覺文化和對我們這個行星進行認知的一個組成部分。1980年1月科學美國人發(fā)表了一幅被稱之為“plume 2”的著名圖像,它是1979年3月5日通過宇宙飛船旅行者1號在木星的衛(wèi)星上探測到的8次火山爆發(fā)中的第二次。這幅圖像在星際探險圖像中是一個里程碑,人們第一次在宇宙中看到了正在爆發(fā)的火山。它也是圖像處理領域的一次偉大勝利。衛(wèi)星

2、圖像以及宇宙探測器所獲取的圖像直到近年來才大量應用圖像處理技術。在這些技術中,對計算機圖像進行數(shù)字化處理以得到想要獲得的效果,比如使圖像的某一部分或某一特性更加明顯。正如計算機圖形學一樣,直到近幾年,圖像處理仍然局限在一些實驗室里使用,只有這些地方才能提供昂貴的圖像處理計算機來滿足處理大量高分辨率圖像的需要。隨著價格低廉的高性能計算機和諸如數(shù)碼相機及掃描儀這樣的圖像采集設備的出現(xiàn),我們已經(jīng)看到圖像處理技術在向公眾領域轉移。經(jīng)典的圖像處理技術很平常地被圖像設計人員用來處理圖片和生成圖像,比如修復圖片的缺陷、改變色彩、對比度等,或者通過圖像邊緣增強這樣的處理來改變整個圖片的外觀。目前圖像處理的主流

3、應用是圖像的壓縮,即通過互聯(lián)網(wǎng)進行傳遞或在可視電話和視頻會議中進行動態(tài)視頻圖像的壓縮。可視電話是當今結合計算機圖像和傳統(tǒng)圖像處理的技術,以期產(chǎn)生很高壓縮比的交叉領域之一。所有這一切都是圖像的“數(shù)字表達”這一不可抗拒的發(fā)展趨勢的組成部分。事實上,20世紀最強大、應用最廣泛的圖像形式電視圖像,也將不可避免的融入數(shù)字領域。數(shù)字圖像及其處理技術之所以發(fā)展的如此迅速并獲得廣泛的應用,與其自身的優(yōu)點是息息相關的。1. 再現(xiàn)性好數(shù)字圖像處理與模擬圖像處理的根本不同在于,它不會因圖像的存儲、傳輸或復制等一系列變換操作而導致圖像質(zhì)量的退化。只要圖像在數(shù)字化時準確地表現(xiàn)了原稿,則數(shù)字圖像處理過程始終能保持圖像的再

4、現(xiàn)。2. 處理精度高按目前的技術,幾乎可將一幅模擬圖像數(shù)字化為任意大小的二維數(shù)組,這主要取決于圖像數(shù)字化設備的能力?,F(xiàn)代掃描儀可以把每個像素的灰度等級量化為16位甚至更高,這意味著圖像的數(shù)字化精度可以達到滿足任一應用需求。對計算機而言,不論數(shù)組大小,也不論每個像素的位數(shù)多少,其處理程序幾乎是一樣的。換言之,從原理上講不論圖像的精度有多高,處理總是能實現(xiàn)的,只要在處理時改變程序中的數(shù)組參數(shù)就可以了?;叵胍幌聢D像的模擬處理,為了要把處理精度提高一個數(shù)量級,就要大幅度地改進處理裝置,這在經(jīng)濟上是極不合算的。3. 適用面寬圖像可以來自于多種信息源,它們可以是可見光圖像,也可以是不可見的波譜圖像(例如x

5、射線圖像、射線圖像、超聲波圖像或紅外圖像等)。從圖像反映的客觀實體尺度看,可以小到電子顯微鏡圖像,大到航空照片、遙感圖像甚至天文望遠鏡圖像。這些來自不同信息源的圖像只要被變換為數(shù)字編碼形式后,均是用二維數(shù)組表示的灰度圖像(彩色圖像也是由灰度圖像組合成的,例如rgb圖像由紅、綠、藍三個灰度圖像組合而成),因而均可用計算機來處理。即只要針對不同的圖像信息源,采取相應的圖像信息采集措施,圖像的數(shù)字處理方法可適用于任何一種圖像。4. 靈活性高圖像處理大體上可分為圖像的像質(zhì)改善、圖像分析和圖像重建三大部分,每一部分均包含豐富的內(nèi)容。由于圖像的光學處理從原理上講只能進行線性運算,這極大地限制了光學圖像處理

6、能實現(xiàn)的目標。而數(shù)字圖像處理不僅能完成線性運算,而且能實現(xiàn)非線性處理,即凡是可以用數(shù)學公式或邏輯關系來表達的一切運算均可用數(shù)字圖像處理實現(xiàn)。鑒于數(shù)字圖像自身的特點,對其進行處理也不是一步就能完成的過程??蓪⑺殖芍T多步驟,必須一個接一個地執(zhí)行這些步驟,直到提取出有用的數(shù)據(jù)。而這些步驟中,數(shù)據(jù)的存儲、表示又占有相當重要的地位,可以說,這是圖像處理中最基本的技術。因此,掌握不同格式圖像的編碼解碼、讀寫、顯示等方法是必不可少的。為什么會需要如此眾多不同類型的圖像文件格式呢?簡單的回答就是因為有太多不同類型的圖像以及眾多不同需求的應用。完整一些的回答還要考慮到市場份額、所有權以及在圖像工業(yè)中缺乏的必要

7、協(xié)調(diào)。但是,已經(jīng)有一些標準的文件格式被開發(fā)出來。許多其他圖像類型可以通過圖像轉換軟件很容易地轉換成這些文件格式,如本設計最終開發(fā)出的軟件就可以將圖像在bmp、pcx、tga、gif及jpeg之間互相轉換。與計算機圖像相關的一個領域就是計算機圖形學。計算機圖形學是計算機科學的一個特殊領域,它指的是通過計算機對可視數(shù)據(jù)進行再現(xiàn),這包括為顯示或打印生成計算機圖像,以及為輸出到監(jiān)視器、打印機、照相機或其他能提供圖像的設備上生成和處理的任何圖像(真實的或人造的)??梢哉J為計算機圖形學是計算機圖像技術的一部分,圖形設計師所使用的許多工具也正在被計算機圖像專業(yè)人士所采用。在計算機圖形學中,圖像數(shù)據(jù)的類型被分

8、為兩個主要種類:矢量和位圖。矢量圖像是指僅通過存儲關鍵點來表達線條、曲線和形體的方法。這些關鍵點足以對形體進行定義,而將它變成圖像的過程稱之為渲染。當圖像被渲染之后,它可以被認為是位圖格式,其中每一個像素都具有與之相關的特定值。位圖圖像(也稱之為光柵圖像)可由圖像模型i(r, c)來表示,其中包含像素數(shù)據(jù)以及某些文件格式存儲的相應的亮度值。盡管有些文件被壓縮,但仍屬于位圖圖像的范疇,通常這些類型的圖像包含頭信息和原始圖像數(shù)據(jù)。文件頭必須包含的信息為:(1)行數(shù)(高);(2)列數(shù)(寬);(3)每像素位數(shù);(4)文件類型。此外,對于某些復雜的文件格式,文件頭還必須包含有關所使用的壓縮類型的信息,以

9、及創(chuàng)建圖像所需要的其他必要的參數(shù)。本設計所討論和處理的圖像均為位圖圖像。第2章 軟件開發(fā)平臺及編程模式在系統(tǒng)的設計與開發(fā)中,軟件開發(fā)平臺及編程模式是關鍵,下面介紹一下開發(fā)平臺的選擇、microsoft visual c+及編程模式。2.1 開發(fā)平臺的選擇在windows環(huán)境下,目前比較流行的可視化開發(fā)工具主要有:visual c+、visual basic、c+ builder、delphi、power builder及jbuilder等。而本軟件采用microsoft visual c+ 6.0作為開發(fā)工具,并使用mfc application framework作為本軟件的基本架構。采用c

10、+來進行圖像編程的主要原因是,與java和c#等現(xiàn)代編程語言相比,c+在程序運行的效率、內(nèi)存使用的可控性和編程的靈活性上具有優(yōu)勢。圖像處理需要處理大量的圖像數(shù)據(jù),經(jīng)常使用復雜、費時的算法,因此圖像處理程序的效率非常重要。c+代碼被編譯成匯編語言,可以直接在處理器上運行,效率很高。而java被編譯成字節(jié)碼,c#被編譯成中間語言,都是不能在處理器上執(zhí)行的,必須經(jīng)過java虛擬機或.net通用語言運行時的jit編譯之后才能執(zhí)行,因此效率較低。故從運行效率的角度看,采用c+進行圖像編程比較合適。對龐大的圖像數(shù)據(jù)進行處理時需要使用大量的內(nèi)存,而計算機的物理內(nèi)存容量往往是有限的,因此需要有效地控制內(nèi)存的使

11、用。c+直接控制內(nèi)存的分配和釋放,這雖繁瑣,且加大了編程的負擔,但卻能有效地控制內(nèi)存的使用。java和c#引進了垃圾收集機制,將開發(fā)人員從內(nèi)存管理的繁雜任務中解放出來,不再需要直接控制內(nèi)存的分配和釋放。但是,無效內(nèi)存的收集和釋放只能周期性地進行,難以達到有效地使用內(nèi)存。同樣的運算,使用java和c#所需的內(nèi)存比使用c+所需的內(nèi)存要多,即內(nèi)存的使用率較低。所以,從內(nèi)存的使用效率來看,采用c+進行圖像處理編程更合適。c+中大量使用指針,使得編程的靈活性很高,這雖然增加了程序出錯的可能性,但是便于程序員施展編程技巧來提高程序的效率。java完全取消了指針,c#極大地限制了指針的使用,這都限制了程序員

12、施展技巧。因此,使用c+進行圖像處理編程具有更大的靈活性。而在以c+為核心語言的可視化編程工具中,microsoft visual c+ 6.0以其自身許多優(yōu)異的特性而獲得了最為廣泛的應用。鑒于以上原因,本設計使用microsoft visual c+ 6.0作為軟件的開發(fā)平臺。2.2 microsoft visual c+及編程模式簡介1. visual c+可視化編程visual c+的資源編輯器能以所見即所得(what you see is what you get)的形式直接編輯程序的用戶界面,為所有資源分配id標識號。classwizard能把對話框模板與生成的類定義或與已有的類代碼

13、連接起來,為菜單項、控制等資源生成空的處理函數(shù)模板,創(chuàng)建消息映射條目,并將資源id與處理函數(shù)連接起來。通過使用appwizard,程序員的編程工作便簡化為用資源編輯器直觀的設計界面,完善對話框類代碼,在空的處理函數(shù)模板處填寫響應用戶操作的代碼,這是一種比較完善的可視化編程方法。但產(chǎn)品名“visual c+”也容易誤導人,讓人認為自己使用的是一個與microsoft visual basic類似的完全可視化的系統(tǒng)。然而,使用visual c+,開發(fā)人員必須真正地閱讀和編寫c+代碼。visual c+向?qū)Э梢怨?jié)省時間和提高精度,但是,程序員也必須理解向?qū)Мa(chǎn)生的代碼,并且,最重要的是,還必須理解mf

14、c庫的結構和windows操作系統(tǒng)的內(nèi)部工作方式。2. mfc(microsoft foundation classes)應用程序框架應用程序框架的一種定義是:提供一般應用程序需要的全部面向?qū)ο筌浖M件的集成集合。c+流行的一個原因是它可以用類庫擴充。類庫是可在應用程序中使用的有關c+類的集合。應用程序框架是類庫的超集。一般的類庫只是一種孤立的類的集合,用來嵌入在任何程序中,但是,應用程序框架卻定義了程序的結構。自從mfc庫發(fā)布以來,mfc已經(jīng)成為主要的windows類庫。使用mfc類庫構建應用程序具有以下優(yōu)點:l mfc庫是c+的microsoft windows api。l 應用程序框架生

15、成的應用程序使用了標準的結構,具有標準化的用戶接口,這對具有標準用戶界面的win32程序來說,可以極大的減輕程序員的負擔,使程序員不必過多地考慮界面,可把主要精力放在程序設計上,以提高程序設計的效率。l 使用應用程序框架的應用程序不僅小,而且運行速度快,具有很大的靈活性。mfc封裝了win32 sdk中的幾乎所有函數(shù),能實現(xiàn)win32系統(tǒng)的任何功能。l visual c+工具降低了編碼的復雜性。l mfc庫應用程序框架有豐富的特性,如:windows api的c+接口、通用的(非windows所特有的)類、“共用根對象”類層次結構、流線式多文檔界面(mdi)應用程序支持等。l 強大的功能。除封

16、裝了大部分的win32 sdk函數(shù)外,mfc還提供了應用程序本身的數(shù)據(jù)和操作及activex、ole、internet、winsock、dao(data access objects)、odbc(open database connectivity)等操作類。mfc框架的核心是文檔/視圖結構(document-view architecture),這是一個很好用、但又往往較難以入門的功能。簡單的說,文檔/視圖結構就是將數(shù)據(jù)和對數(shù)據(jù)的觀察或數(shù)據(jù)的表現(xiàn)(顯示)相分離。文檔僅處理數(shù)據(jù)的實際讀、寫操作,視圖則是顯示和處理數(shù)據(jù)的窗口,視圖可以操作文檔中的數(shù)據(jù)。3. win32編程編寫visual c+程

17、序?qū)嶋H上就是一個構造類和把類實例化的過程。由于windows 95/98/me/nt/2000是pc平臺中應用最廣泛的操作系統(tǒng),而microsoft力圖用一個叫做win32的標準32位應用程序接口作為對這幾個操作系統(tǒng)的共同開發(fā)接口,所以經(jīng)常采用win32來代表microsoft的32位windows操作系統(tǒng),因此visual c+主要用于針對win32的應用程序開發(fā)。win32具有搶先式多任務、多線程和線性尋址內(nèi)存管理等特征,win32編程的基本要求包括:l 應用程序的執(zhí)行獨立于硬件設備。l 應用程序具有圖形用戶界面。l 能在windows 95/98/me和windows nt/2000/x

18、p之間透明移植,并可移植到支持windows nt/2000的risc硬件平臺。l 高性能的搶先式多任務和多線程管理。l 高級的多媒體支持。l 通過ole 2技術實現(xiàn)多個應用程序的對象定位。microsoft為進行win32編程提供了一套名為win32 sdk的應用程序編程接口,其中包括上千個win32系統(tǒng)函數(shù)。visual c+包括一套叫做mfc(microsoft foundation class library)的c+類庫,其中定義了進行win32編程所需要的各種類。有的類封裝了大部分的win32 sdk中應用程序的編程接口函數(shù);有的類封裝的則是應用程序本身的數(shù)據(jù)和操作;還有的類封裝了a

19、ctivex、ole和internet編程特性以及winsock網(wǎng)絡特性和dao(data access objects)、odbc(open database connectivity)數(shù)據(jù)訪問功能。win23 sdk和mfc是實現(xiàn)win32編程的主要工具。visual c+的appwizard工具能自動生成應用程序框架,該框架定義了應用程序的輪廓,并提供了用戶接口的標準實現(xiàn)方法。運用visual c+的資源編輯器(resource editor)能直觀地設計程序的用戶界面,而classwizard能把用戶界面和程序代碼連接起來。程序員要做的就是用mfc類實現(xiàn)框架中未完成的應用程序的特定功能

20、部分。所以使用visual c+可以實現(xiàn)win32的可視化程序設計。4. 消息映射在使用visual c+進行win32程序設計時,消息映射是一個非常重要的概念。windows應用程序是消息驅(qū)動的,應用程序不能直接得到用戶所做的操作,如鼠標按鍵、鍵盤輸入和窗口移動等。這些操作由操作系統(tǒng)管理,操作系統(tǒng)檢測到操作事件后,便向相關的應用程序發(fā)送消息,應用程序響應這些消息來完成用戶的操作。(1)消息windows中的消息是操作系統(tǒng)與應用程序之間、應用程序與應用程序之間、應用程序各對象之間相互控制與傳遞信息的方式。消息的基本格式如下:message wparam lparammessage是消息名稱;w

21、param是與消息相關的word型參數(shù);lparam是與消息相關的long型參數(shù)。消息主要有以下3類。l windows系統(tǒng)消息:windows系統(tǒng)向窗口發(fā)送的消息,由窗口(window)或視圖(view)進行響應處理。這類消息包括除wm_command消息之外的名稱以wm_開始的其他消息。l 控制通知消息:控制或子窗口傳給父窗口的wm_command通知的消息。l 命令消息:在響應用戶接口操作時,將產(chǎn)生wm_command命令消息。其參數(shù)指定了用戶接口的標識號,如菜單項和按鈕等id號。(2)消息映射過程在使用appwizard創(chuàng)建應用程序時,mfc應用程序框架設置了相應的消息處理函數(shù)來響應消

22、息,以完成相應的操作。消息處理函數(shù)是某些類(通常是窗口類)的成員函數(shù)和程序員在其中編寫響應消息時應進行操作的代碼??蚣軐⑾⒑退鼈兊奶幚砗瘮?shù)連接起來就是消息映射。消息映射使應用程序在接收到消息時調(diào)用對應的消息處理函數(shù)來響應和處理消息。classwizard在創(chuàng)建新類時將為其創(chuàng)建一個消息映射,并為每個類能響應的消息和命令增加對應的處理函數(shù)。在源代碼中,消息映射開始于begin_message_map宏,結束于end_message_map宏,中間由一系列預定義的被稱為“條目宏”的宏組成。其基本格式如下:begin_message_map (classname, parentclassname)/

23、afx_msg_map (classname)條目宏1條目宏2條目宏3/afx_msg_mapend_message_map ()其中classname為擁有消息映射的當前類名,parentclassname為當前類的父類名。條目宏定義了類所處理的消息與其對應的函數(shù)。常用的條目宏類型如表2.1所示。表2.1 消息映射條目宏消息類型宏格式說明windows消息on_wm_xxxxwm_xxxx為windows消息名命令on_command(id,function)id為命令標識號,function為處理函數(shù)名更新命令on_update_command_ui(id,function)id為命令標識

24、號,function為處理函數(shù)名控制通知on_xxxx(id,function)id為控制標識號,function為處理函數(shù)名用戶定義消息on_message(id,function)id為消息標識號,function為處理函數(shù)名用戶注冊消息on_registered_message(id,function)id為消息標識號,function為處理函數(shù)名windows消息的處理函數(shù)在cwnd類中進行了預定義,類庫以消息名為基礎定義這些處理函數(shù)的名稱,且mfc要求所有消息處理函數(shù)聲明為afx_msg類型。例如,消息wm_paint的處理函數(shù)在cwnd類中的聲明如下:afx_msg void on

25、paint();通過classwizard在派生類中用同樣的原型定義處理函數(shù)并為該函數(shù)生成消息映射條目,然后由程序員編寫處理函數(shù)代碼,并在派生類中覆蓋了其父類的消息處理函數(shù)。在有些情況下,必須在派生類的消息處理函數(shù)中調(diào)用其父類的消息處理函數(shù),使windows和基類能對消息進行處理。classwizard將在生成的處理函數(shù)中建議是否應調(diào)用父類的消息處理函數(shù)及調(diào)用的次序。除此之外,用戶定義和注冊的消息、命令和控制通知都沒有默認的處理函數(shù),需要在定義時聲明,一般根據(jù)其id名稱來為函數(shù)命名。第3章 圖像格式分析在前面曾提到,用數(shù)字來表示圖像有兩種不同的方式,即矢量圖和位圖(又稱為柵格、光柵圖像或像素圖

26、)。在具體的實現(xiàn)上,不同的廠家,在不同的系統(tǒng)上和不同的軟件中又采用不同的圖像表示方式,即以不同的圖像格式來表示數(shù)字圖像。因此,一個通用的圖像處理軟件應該能支持多種不同的圖像格式,至少應能支持常用的幾種圖像格式。本設計所實現(xiàn)的圖片瀏覽軟件支持以下幾種圖像格式:bmp、pcx、tga、jpeg、gif。這幾種圖像格式均為在圖像處理領域及實際應用中廣泛使用的圖像格式。由于圖像質(zhì)量的提高是建立在圖像數(shù)據(jù)量增大的基礎上的,而圖像數(shù)據(jù)量的增大將不可避免地降低圖像處理的速度,并且給存儲和傳遞帶來困難。因此,如何有效地控制數(shù)字圖像的存儲量已成為數(shù)字圖像處理的一項重要課題。數(shù)據(jù)壓縮技術是控制數(shù)據(jù)量的基本技術。所

27、謂數(shù)據(jù)壓縮,就是用更少的數(shù)據(jù)位存儲相同容量的信息,目的是更高效地存儲信息。各種圖像格式都可以采用一種,甚至多種不同的數(shù)據(jù)壓縮算法來壓縮數(shù)據(jù)量,因此圖像格式和壓縮算法是密切相關的。而開發(fā)圖像處理軟件也應首先了解圖像的編碼及解碼方法。3.1 圖像的編碼和解碼能夠?qū)?shù)據(jù)進行壓縮并大大減少其數(shù)據(jù)量是因為數(shù)據(jù)存在大量的數(shù)據(jù)冗余,即存在冗余的、可預測的和不必要的數(shù)據(jù)。數(shù)據(jù)量(d)與其所表達的信息量(i)一般并不相等,它們之間存在如下關系:i=d-dudu0其中,du代表數(shù)據(jù)的冗余量,如冗余量du=0,則不需要也不能對數(shù)據(jù)進行有效壓縮。即,需要并能夠?qū)?shù)據(jù)進行有效壓縮的條件是du0。而圖像數(shù)據(jù)中廣泛存在著數(shù)

28、據(jù)冗余。數(shù)據(jù)冗余一般有4種形式,即統(tǒng)計冗余、信息熵冗余、結構冗余、知識冗余。利用冗余進行圖像數(shù)據(jù)壓縮包括兩個相反的過程。l 數(shù)據(jù)編碼:即對原始圖像數(shù)據(jù)進行編碼,以減小其數(shù)據(jù)量。l 數(shù)據(jù)解碼:即把編碼壓縮的圖像數(shù)據(jù)還原成原始的表示形式。由于數(shù)據(jù)編碼和數(shù)據(jù)解碼是互逆的過程,只要研究好數(shù)據(jù)編碼就能處理好數(shù)據(jù)解碼。根據(jù)冗余類型的不同,人們提出了不同的數(shù)據(jù)編碼方法,根據(jù)不同的出發(fā)點可把數(shù)據(jù)編碼方法進行不同的分類。(1)以對編碼數(shù)據(jù)在解碼后能否完全一致的還原為原始數(shù)據(jù)為標準,可將數(shù)據(jù)編碼方法劃分為如下兩類。l 無失真編碼(可逆編碼):編碼數(shù)據(jù)進行解碼后的數(shù)據(jù)與編碼前的原始數(shù)據(jù)完全相同,沒有任何失真。l 有

29、失真編碼(不可逆編碼):編碼數(shù)據(jù)進行解碼后的數(shù)據(jù)與編碼前的數(shù)據(jù)有一定的偏差或失真,但在視覺效果上基本相同。(2)根據(jù)數(shù)據(jù)編碼的實現(xiàn)原理可以把數(shù)據(jù)編碼劃分為預測編碼、變換編碼、信息熵編碼、亞抽樣與內(nèi)插編碼、矢量量化編碼、基于神經(jīng)網(wǎng)絡的編碼、分頻帶編碼、結構編碼、基于知識的編碼和混合編碼等10類。其中,信息熵編碼中的哈夫曼編碼(huffman coding)、lzw(lempel ziv welch compression)編碼、游程長度編碼(run length coding)和算術編碼(arithmetic coding)都是常用的無失真圖像編碼方式。由于本設計并未涉及到上述所有的編碼算法,故

30、在此不再進行一一說明,在后面的內(nèi)容中會對使用到的算法及其實現(xiàn)進行詳細論述。3.2 bmp圖像bmp圖像,即通常所說的位圖(bitmap),是windows系統(tǒng)中最為常見的圖像格式。windows 3.0以前的版本只支持與設備相關位圖ddb(device dependent bitmap)。ddb是一種內(nèi)部位圖格式,它顯示的圖像依計算機顯示系統(tǒng)的設置不同而不同,因此一般不存儲為文件,與通常所說的bmp圖像不同。在windows.h中,結構體bitmap定義了ddb位圖的類型、寬度、高度、顏色格式和像素位值等,代碼如下:typedef struct tagbitmap int bmtype;/位圖

31、類型,必須設為0 int bmwidth; /位圖寬度 int bmheight;/位圖高度 int bmwidthbytes;/位圖中每一掃描行中的字節(jié)數(shù) byte bmplanes;/顏色層數(shù) byte bmbitspixel;/每一像素所占的位數(shù) void far*bmbits; /存放像素值內(nèi)存塊的地址bitmap;ddb中不包括顏色信息,顯示時是以系統(tǒng)的調(diào)色板為基礎進行像素的顏色映射的。windows只能保證系統(tǒng)調(diào)色板的前20種顏色穩(wěn)定不變,所以ddb只能保證正確顯示少于20色的位圖。windows sdk提供標準的ddb位圖操作函數(shù);mfc中定義了cbitmap類來說明ddb位圖,

32、其中封裝了與ddb位圖操作相關的數(shù)據(jù)結構和函數(shù)。windows 3.1以上版本提供了對設備無關位圖dib(device independent bitmap)的支持。dib位圖可以在不同的機器或系統(tǒng)中顯示位圖所固有的圖像。相對于ddb而言,dib是一種外部位圖格式,經(jīng)常存儲為常見的以bmp為后綴的位圖文件(有時也以dib為后綴)。因此,通常所說的bmp圖像,即是dib位圖。bmp位圖文件包括4部分,即位圖文件頭結構bitmapfileheader、位圖信息頭結構bitmapinfoheader、位圖顏色表rgbquad和位圖像素數(shù)據(jù),bmp位圖文件的結構如圖3.1所示。位圖文件頭結構bitma

33、pfileheader位圖信息頭結構bitmapinfoheader位圖顏色表rgbquad位圖像素數(shù)據(jù)圖3.1 bmp位圖文件的結構下面介紹bmp文件頭、bmp位圖信息頭、顏色表這3個結構體在windows.h中的定義。1. bmp文件頭bmp文件頭含有bmp文件的類型、文件的大小、位圖文件的保留字、位圖數(shù)據(jù)距文件頭的偏移量等信息。定義如下:typedef struct tagbitmapfileheader uint bftype;/位圖文件的類型,必須為bm dword bfsize;/位圖文件的大小,以字節(jié)為單位 uint bfreserved1;/位圖文件保留字,必須為0 uint

34、bfreserved2;/位圖文件保留字,必須為0 dword bfoffbits;/位圖數(shù)據(jù)距文件頭的偏移量,以字節(jié)為單位 bitmapfileheader;2. bmp位圖信息頭bmp位圖信息頭用于說明位圖的尺寸等信息,定義如下:typedef struct tagbimapinfoheader dword bisize; /本結構所占用字節(jié)數(shù) long biwidth; /位圖的寬度,以像素為單位 long biheight; /位圖的高度,以像素為單位 word biplanes; /目標設備的級別,必須為1 word bibitcount; /每個像素所需的位數(shù),必須是1(雙色)、

35、/4(16色)、8(256色)或24(真彩色)之一 dword bicompression; /位圖壓縮類型,必須是 0(不壓縮)、 /1(bi_rle8壓縮類型)或2(bi_rle壓縮類型)之一 dword bisizeimage; /位圖的大小,以字節(jié)為單位 long bixpelspermeter; /位圖水平分辨率,每米像素數(shù) long biypelspermeter; /位圖垂直分辨率,每米像素數(shù) dword biclrused; /位圖實際使用的顏色表中的顏色數(shù) dword biclrimportant; /位圖顯示過程中重要的顏色數(shù) bitmapinfoheader;3. 顏色表

36、顏色表用于說明位圖中的顏色,它有若干個表項,每一個表項是一個rgbquad類型的結構,且定義一種顏色,定義如下:typedef struct tagrgbquad byte rgbblue;/藍色的亮度(值范圍為0255) byte rgbgreen;/綠色的亮度(值范圍為0255) byte rgbred;/紅色的亮度(值范圍為0255) byte rgbreserved;/保留,必須為0 rgbquad;位圖信息頭和顏色表組成位圖信息,bitmapinfo結構定義如下:typedef struct tagbitmapinfo bitmapinfoheader bmiheader; rgbq

37、uad bmicolorsi; bitmapinfo;顏色表中rgbquad結構數(shù)據(jù)的個數(shù)由bibitcount來確定,當bibitcount=1、4、8時,分別有2、16、256個表項;當bibitcount=24時,沒有顏色表項。位圖數(shù)據(jù)記錄了位圖的每一個像素值,記錄順序是在掃描行內(nèi)從左到右、掃描行之間從下到上。位圖的一個像素值所占的字節(jié)數(shù)如下:l 當bibitcount=1時,8個像素占1個字節(jié)。l 當bibitcount=4時,2個像素占1個字節(jié)。l 當bibitcount=8時,1個像素占1個字節(jié)。l 當bibitcount=24時,1個像素占3個字節(jié)。windows規(guī)定一個掃描行所

38、占的字節(jié)數(shù)必須是4的倍數(shù)(即以long為單位),不足的以0填充,一個掃描行所占的字節(jié)數(shù)計算方法如下:datasizeperline=(biwidthbibitcount+31)/8這是本設計中的一個關鍵點,無論對圖像進行何種變換,都要進行掃描行的4字節(jié)對齊。除了上述的windows bmp以外,還有一種與其結構相似,但不完全相同的另一種bmp圖像,即os/2采用的bmp。其與windows bmp的主要區(qū)別是位圖信息結構(信息頭結構和顏色表結構)不同。而它們的圖像位數(shù)據(jù)的存儲方式是完全一樣的。本設計只討論windows系統(tǒng)下的bmp圖像,故對os/2使用的bmp不進行詳細分析。3.3 pcx圖

39、像pcx是zsoft公司研制的一種常用圖像格式,也是在pc機上使用時間最久的一種位圖格式。pcx的最新版本支持24位色彩(256色的調(diào)色板或全24位rgb),圖像的大小可達64k64k個像素。pcx采用游程長度編碼來壓縮數(shù)據(jù),但是有些情況下壓縮效率不高,尤其是對于掃描圖像或視頻圖像。pcx存在許多的版本,其文件頭中的一個代碼標識了文件所支持的zsoft產(chǎn)品版本,不同版本的圖像特點如表3.1所示。表3.1 不同pcx版本的圖像特點版本號圖像特點0基本的單色(2色)或4色圖像1基本的單色(2色)或4色圖像,另加16位色圖像2基本的單色(2色)或4色圖像,另加24位調(diào)色板的256色以及全24位rgb

40、色圖像3基本的單色(2色)或4色圖像,4基本的單色(2色)或4色圖像5基本的單色(2色)或4色、256色圖像以及多平面真彩色圖像1. 文件結構及文件頭pcx圖像由3個部分組成,即文件頭、位圖數(shù)據(jù)和一個多達256種色彩的調(diào)色板。pcx文件的文件頭為固定的128字節(jié)。其中包含版本號、被打印或掃描圖像的分辨率(單位為每英寸點數(shù))、大?。▎挝粸橄袼財?shù))、每掃描行字節(jié)數(shù)、每像素位數(shù)和彩色平面數(shù)等信息。文件還可能包括一個調(diào)色板以及表明該調(diào)色板是灰度還是彩色的一個代碼。文件的核心部分是位圖數(shù)據(jù)。位圖數(shù)據(jù)以類似于packbits壓縮法的游程長度壓縮形式記錄,像素值通常是單字節(jié)的索引值,指向調(diào)色板中的位置。如果

41、版本號為5,則文件末尾處還有一個單一的位平面和一個rgb值的256色調(diào)色板,3種原色各占1個字節(jié)。pcx格式圖像的文件頭結構如表3.2所示。表3.2 pcx文件頭結構起始字節(jié)字節(jié)數(shù)內(nèi)容解釋01zsoft標志10(0x0a),zsoft pcx文件的標志11版本號0:pc paintbrush 2.51:pc paintbrush 2.8,帶調(diào)色板21編碼1:pcx游程長度編碼31位/像素每個平面的位/像素值,可能值為1、2,、4或848圖像大小圖像邊界極限為xmin、ymin、xmax、ymax,以像素為單位122水平分辨率打印時,x方向的每英寸點數(shù)142垂直分辨率打印時,y方向的每英寸點數(shù)1

42、648文件頭調(diào)色板16色的“ega/vga”頭調(diào)色板641保留字節(jié)zsoft保留,為0651平面彩色/灰度平面數(shù)。pcx圖像可以是單彩色,也可以具有多個彩色平面662每行字節(jié)數(shù)每個色彩平面的每行字節(jié)數(shù),即存儲未壓縮圖像的一個掃描行所需的字節(jié)數(shù),總是偶數(shù)682調(diào)色板解釋1:彩色或黑白2:灰度702視頻屏幕大小x視頻輸出的水平像素數(shù)-1722視頻屏幕大小y視頻輸出的垂直像素數(shù)-17454全空直到文件結束02. 對pcx進行解碼的關鍵因為在一個pcx文件中可以用到幾種不同的記錄方法,因此其中必須包含所用方法的標志。在對pcx進行解釋時,單靠讀取版本號是不夠的,最可靠的標志是每像素的位數(shù)(文件頭的第3

43、個字節(jié))和色彩平面數(shù)(文件頭的第65個字節(jié)),這兩個標志與圖像色彩數(shù)的對應關系如表3.3所示。表3.3 pcx數(shù)據(jù)的解釋每像素的位數(shù)色彩平面數(shù)解釋11單色124色138色1416色214色2416色4116色81256色8316.7兆色平面數(shù)說明是否使用了調(diào)色板。多于一個平面則沒有調(diào)色板。如果使用了調(diào)色板,則可以由版本號和每像素位數(shù)決定pcx圖像所使用的調(diào)色板類型。3. pcx圖像數(shù)據(jù)的存儲如果沒有使用調(diào)色板,則數(shù)據(jù)是實際的像素值;否則是調(diào)色板表項的索引值。當是實際的像素值時,它們按色彩平面和掃描行存儲。其存儲格式為:第0行 rrrrrrggggggbbbbbb第1行 rrrrrrgggggg

44、bbbbbb第n行 rrrrrrggggggbbbbbb如果有兩個平面,那么色彩是任選的;如果有3個平面,其顏色為rgb;如果有4個平面,則顏色信息包含rgb和光強。光強位只是給像素一種名義上的較高亮度。當使用調(diào)色板時,數(shù)據(jù)指調(diào)色板的索引值,它們構成一個完整的圖像平面,即不會被分解為單獨的色彩平面。數(shù)據(jù)將按如下的簡單方式排列(i是調(diào)色板中的索引值):第0行 iiiiiiiiiiiii第1行 iiiiiiiiiiiii第n行 iiiiiiiiiiiiii的長度取決于每像素的位數(shù),如每像素位數(shù)為4,則i就是半個字節(jié)長。pcx的編碼是以最大64個重復單元為一組進行壓縮的,不論要記錄的是何種類型的數(shù)據(jù)

45、,都使用同樣的游程長度壓縮算法。在掃描行中有編碼間隔標志,但是,在一個掃描行中的色彩平面之間沒有間隔標志。同樣,也沒有分隔符來標識一個掃描行結束。4. pcx圖像的調(diào)色板任何pcx文件,如果像素位數(shù)超過1但又只有一個色彩平面,則都需要使用調(diào)色板。pcx圖像由3種不同的調(diào)色板實現(xiàn)。版本代碼為5的文件最容易確認。如果有一個色彩平面,則它們會在文件結尾處使用256色的“vga”調(diào)色板。其他的基于調(diào)色板的文件均使用頭調(diào)色板,而頭調(diào)色板又有兩種可能的實現(xiàn),即ega和cga。三種不同的調(diào)色板介紹如下。(1)位于文件末尾的256色“vga”調(diào)色板256色的調(diào)色板從文件末尾(eof)前768個字節(jié)開始,而且以

46、十進制碼12(十六進制0c)開始(7682561字節(jié)3,每個r、g和b都是1個字節(jié))。因此,值為n的像素指向調(diào)色板中的“eof-7683n”處;后面3個字節(jié)分別為該像素紅、綠、藍的值。(2)16色的“ega/vga”頭調(diào)色板頭調(diào)色板位于第16第63字節(jié),共48個字節(jié),數(shù)據(jù)按3元組組織,具有16組3字節(jié)數(shù)據(jù),每個字節(jié)分別對應r、g和b。對于為ega建立的文件,每種原色只可以有4級,所以每個字節(jié)提供的256個值的范圍被分成4個區(qū)域。每個區(qū)域與相應的級相對應:063對應第0級、64127對應第1級、128192對應第2級、193254對應第3級。(3)“cga”調(diào)色板這種調(diào)色板現(xiàn)已過時,在pcx的版

47、本5及更高的版本中不再使用。這中方法只需要字節(jié)16和字節(jié)19的最高位數(shù)據(jù)。另外,版本5或更高版本的pcx文件能夠支持24位真彩色的pcx文件,其色彩平面為3個位平面。3.4 tga圖像tga格式是truevision公司設計并負責解釋的圖像格式。tga也包含了多種變體,tga文件的第三個字節(jié)用來區(qū)別不是tga的文件。該字節(jié)的值(二進制整數(shù))及對應的文件類型如下。l 0:文件中沒有圖像數(shù)據(jù)。l 1:未壓縮的,顏色表圖像。l 2:未壓縮的,rgb圖像。l 3:未壓縮的,黑白圖像。l 9:游程長度(runlength)編碼的顏色表圖像。l 10:游程長度(runlength)編碼的rgb圖像。l 1

48、1:壓縮的,黑白圖像。l 32:使用huffman、delta和runlength編碼的顏色表圖像。l 33:使用huffman、delta和runlength編碼的顏色映射圖像,四叉樹類型處理1. 數(shù)據(jù)類型1:未壓縮的顏色表(color-mapped)圖像tga未壓縮顏色表圖像格式的說明如表3.4所示。表3.4 tga未壓縮顏色表圖像格式說明偏移(字節(jié))長度(字節(jié))描述01圖像信息字段(見本子表的后面)的字符數(shù)。本字段是1字節(jié)無符號整型,指出了圖像格式區(qū)別字段長度,其取值范圍是0到255,當它為0時表示沒有圖像的信息字段11顏色表的類型。該字段為表示對應格式1的圖像而包含一個二進制121圖像

49、類型碼。該字段總為1,這也是此類型為格式1的原因35顏色表規(guī)格,顏色表首址32顏色表首元表項的整型(低位-高位)索引52顏色表的長度。顏色表的表項總數(shù),整型(低位-高位)71顏色表表項的位(bit)數(shù)。16代表16位tga、24代表24位tga、32代表32位tga810圖像規(guī)格82圖像x坐標的起始位置。圖像左下角x坐標的整型(低位-高位)值102圖像y坐標的起始位置。圖像左下角y坐標的整型(低位-高位)值122圖像寬度。以像素為單位,圖像寬度的整型(低位-高位)值142圖像高度。以像素為單位,圖像高度的整型(低位-高位)值161圖像每像素存儲占用位(bit)數(shù)171圖像描述符字節(jié)bits 3

50、0:每像素的屬性位(bit)數(shù)bit 4:保留,必須為0bit 5:屏幕起始位置標志0:原點在左下角1:原點在左上角truevision圖像必須為0bits 76:交叉數(shù)據(jù)存儲標志00:無交叉01:兩路奇/偶交叉10:四路交叉11:保留18可變圖像信息字段。包含一個自由格式的,長度是圖像記錄塊偏移0處的字節(jié)中的值。它常常被忽略(即偏移0處值為0),其最大可以含有255個字符。如果需要存儲更多信息,可以放在圖像數(shù)據(jù)之后(續(xù)表)偏移(字節(jié))長度(字節(jié))描述可變可變顏色表數(shù)據(jù)。起始位置由前一個字段的大小決定;其長度由單項數(shù)據(jù)大小和數(shù)據(jù)項數(shù)目決定(在前面相應的說明字段中給出),每項是2字節(jié)、3字節(jié)或4

51、字節(jié),字節(jié)中沒有使用的位(bit)被認為是屬性位(1)4字節(jié)表項中,字節(jié)1表示blue,字節(jié)2表示green,字節(jié)3表示red,字節(jié)4表示屬性(2)3字節(jié)表項中各字節(jié)依次對應blue、green、red(3)2字節(jié)表項中,兩個字節(jié)分解成如下形式:arrrrrgg gggbbbbb,但是,由于低位在前,高位在后的存儲順序,從文件中讀出表項時,將先讀入gggbbbbb而后讀入arrrrrgg,a表示屬性位可變可變圖像數(shù)據(jù)字段。該字段給出了(高度)(寬度)個顏色表項索引,每個索引以整數(shù)個字節(jié)的形式存儲(典型的例子如1或2個字節(jié))所有的數(shù)據(jù)都沒有符號,對于2字節(jié)表項而言,低位字節(jié)是先存儲的2. 數(shù)據(jù)類

52、型2:未壓縮的無顏色表rgb圖像tga未壓縮的無顏色表rgb圖像格式的說明如表3.5所示。表3.5 tga未壓縮的無顏色表rgb圖像格式說明偏移(字節(jié))長度(字節(jié))描述01圖像信息字段(見本子表的后面)的字符數(shù)。本字段是1字節(jié)無符號整型,指出了圖像格式區(qū)別字段的長度,其取值范圍是0到255,當它為0時表示沒有圖像的信息字段11顏色表類型。該字段的內(nèi)容或者為0或者為1;0表示沒有顏色表,1表示顏色表存在。由于本格式是無顏色表的,因此此項通常被忽略21圖像類型碼。該字段總為2,這也是此類型為格式2的原因35顏色表規(guī)格。如果顏色表類型字段為0則被忽略;否則描述如下32顏色表首址。顏色表首元入口的整型

53、(低位-高位)索引52顏色表的長度。顏色表的表項總數(shù),整型(低位-高位)71顏色表表項的位(bit)數(shù)。16代表16位tga、24代表24位tga、32代表32位tga810圖像規(guī)格82圖像x坐標起始位置。圖像左下角x坐標的整型(低位-高位)值102圖像y坐標起始位置。圖像左下角y坐標的整型(低位-高位)值122圖像寬度。以像素為單位,圖像寬度的整型(低位-高位)值142圖像高度。以像素為單位,圖像高度的整型(低位-高位)值161圖像每像素存儲占用位(bit)數(shù)。它的值為16、24或32等,決定了該圖像是tga 16、tga24、tga 32等(續(xù)表)偏移(字節(jié))長度(字節(jié))描述171圖像描述

54、符字節(jié)bits 30:每像素對應的屬性位的位數(shù);對于tga 16,該值為0或1;對于tga 24,該值為0;對于tga 32,該值為8bit 4:保留,必須為0bit 5:屏幕起始位置標志0:原點在左下角1:原點在左上角truevision圖像必須為0bits 76:交叉數(shù)據(jù)存儲標志00:無交叉01:兩路奇/偶交叉10:四路交叉11:保留18可變圖像信息字段。包含一個自由格式的,長度是圖像記錄塊偏移0處的字節(jié)中的值。它常常被忽略(即偏移0處值為0),注意其最大可以含有255個字符。如果需要存儲更多信息,可以放在圖像數(shù)據(jù)之后可變可變顏色表數(shù)據(jù)。如果顏色表類型為0,則該域不存在,否則越過該域直接讀

55、取,圖像顏色表規(guī)格中描述了每項的字節(jié)數(shù),為2、3、4之一可變可變圖像數(shù)據(jù)域。這里存儲了(寬度)(高度)個像素,每個像素中的rgb色值;該色值包含整數(shù)個字節(jié)(1)3字節(jié)表項中各字節(jié)依次對應blue、green、red。(2)2字節(jié)表項中,兩個字節(jié)分解成如下形式:arrrrrgg gggbbbbb,但是,由于低位在前,高位在后的存儲順序,從文件中讀出表項時,將先讀入gggbbbbb而后讀入arrrrrgg;a表示屬性位(3)4字節(jié)表項包含了分別代表blue、green、red及屬性的四個字節(jié)。(由于硬件上的原因)有的時候tga 24類型的圖像也像tga 32類型的圖像那樣存儲3. 數(shù)據(jù)類型9:帶顏色表的游程長度(runlength)編碼圖像帶顏色表的游程長度編碼tga圖

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論