摘要:隨著數據庫技術的廣泛應用以及多媒體技術的發展,對圖像等多媒體數據的存取已成為操作數據庫系統的常見問題。結合某針織企業管理信息系統開發的實踐,利用流技術、圖像轉換及圖像顯示技術等對該問題進行了研究并給出一種設計方案,以SQL Server 2005為后臺數據庫,以Delphi 7為前臺開發工具,實現了圖像安全可靠的數據庫管理,效果良好。
關鍵詞:圖像數據;流;圖像轉換;圖像顯示;Delphi
中圖分類號:TP311文獻標識碼:A 文章編號:1009-3044(2008)36-2717-02
Design of the Storage and Extraction of Image Data Based on Delphi
ZHANG Yan, FEI Shu-min
(School of Automation, Southeast University, Nanjing 210018,China)
Abstract: It's a common problem of database system manipulation to store and extract multimedia data like image data as the widespread application of database technology and the development of multimedia technology. It makes a study of the problem using the technology of Stream,the conversion and display of image,puts forward a design which takes SQL Server 2005 asbackground database and Delphi 7 as proscenium developmental tools according to the practice developing in MIS for a knitting enterprise and fulfills the database management of image data having a good effect.
Key words: image data; stream; image conversion; image display; delphi
1 引言
隨著數據庫技術在社會生活各方面的應用,數據庫處理的數據種類也越來越豐富,包括對圖像、視頻、音頻等多媒體數據的處理,本文主要針對圖像數據進行處理。目前大多數的數據庫系統對圖像數據的處理都采用間接的存取方式,將圖像存儲在計算機指定目錄下,在數據庫中只存儲數據圖像文件的路徑,這種操作方式造成數據存儲的不同步性,從而帶來數據的不安全性、不完整性以及管理的不方便性,并未真正實現圖像數據的數據庫存儲[1]?;跀祿毂4鏀祿囊恢滦?、對數據的優化以及數據的可用性等優點,將圖像數據與其它數據一起保存到數據庫是必然趨勢,這將有利于數據的安全性和完整性,同時可以發揮數據庫的數據復制、轉移等強大功能[2]。
本文針對某針織企業信息管理系統中圖像數據的存取問題進行了研究并給出一種設計方案,實現了該企業服裝款式圖像的數據庫存儲與讀取,效果良好。
2 圖像數據存取設計方案
據該針織企業的實際情況,要求存取服裝款式圖像的輪廓圖,對圖像的品質沒有過高的要求,針對該需求本文給出一種設計方案,即將圖像統一轉換成便于存儲、讀取和傳輸的JPEG圖像格式,并應用流技術將圖像轉換為二進制流存入數據庫,瀏覽時從數據庫中將流數據讀出并用浮動窗口顯示,具體過程如圖1所示。
2.1 圖像類型轉換
圖像類型轉換是指BMP圖像格式與JPEG圖像格式之間的轉換。BMP文件是一種位圖格式文件,將圖像中的像素值以二維像素矩陣的形式存儲在文件中,除圖像灰度可選外不采用其他任何壓縮,因此占用空間較大,一般需要進行數據壓縮。為了便于BMP文件的存儲和網絡傳送,產生了其它種類繁多的文件格式如JPEG、GIF、TIFF等,其中目前最流行的是JPEG圖像格式。JPEG格式的文件是一種平臺獨立格式,采用的是失真壓縮格式,刪除圖像中重復或不重要的資料,壓縮率高,圖像被壓縮后占存儲空間小,但對色彩信息保留得較好,基本不影響視覺效果,可以滿足不追求高品質圖像的數據存儲的要求。該針織企業規模大,服裝款式圖像數量龐大,因此要實現圖像的管理就需要將圖像統一為占用存儲空間小的JPEG格式,便于存儲與讀取。
VCL(Visual Component Library)即可視化組件庫,是Delphi在Windows平臺開發的核心和靈魂,并且是完全面向對象、面向繼承的。TObject是VCL所有類的基類,所具有的Create(),Free()方法分別用于為對象賦予和釋放內存。TPersistent為TObject的繼承類,提供了Assign方法,該方法允許一個組件將另外組件的相關數據賦給自己。而處理BMP、JPEG格式圖像的類TJPEGImage繼承于TGraphic類,而TGraphic類繼承自TPersistent類,故可使用Assign方法來實現數據格式的轉換。該方法的原型:

圖1 圖像數據存取過程
procedure Assign(Source:TPersistent);override;
其中,參數Source類型為TPersistent,該類型封裝了一切可以被指定為其他對象的所有對象的基本行為。在TJPEGImage類中使用Assign方法,可以把Source對象中包含的圖像信息寫入TJPEGImage對象實例。
具體實現:Delphi對JPEG文件的操作是由JPEG單元的TJPEGImage類實現的,所以首先要在單元接口部分的uses語句中引用JPEG單元。用OpenDialog控件打開圖像文件,然后取出文件擴展名來判斷原始圖像格式,若為BMP格式則用Assign方法將載入的位圖數據復制到TJPEGImage實例中轉換為JPEG格式;若為JPEG格式則不作處理;其它作為異常處理。
2.2 流技術
圖像數據是一種特殊的數據形式,屬BLOB數據(Binary Large Object,二進制大對象),在數據庫中以不確定長度的二進制形式存儲,因此對圖像數據的操作也不同于對其他常規類型數據的操作,需要借助流技術來實現其存儲與讀取。
流是基于面向對象技術發展起來的,是面向對象中對象式數據管理的一個重要的類。簡單的說,流就是建立在面向對象基礎上的一種抽象的處理數據的工具。對象式數據管理包括兩方面的內容:用對象管理數據和管理數據對象(包括對象和組件)。而流的基本操作也是基于這兩方面的。流將對各種數據類型在各種媒介(包括Windows資源文件、磁盤文件、內存、外存和數據庫字段等)中的管理操作抽象為對象方法,通過這些對象方法來管理數據。同時,流還對各種對象組件進行管理。在流中,定義了一些處理數據的基本操作,如讀取數據、寫入數據和數據定位等。流的操作原理是將各種數據對象抽象成二進制數據對象,并提供統一的接口來使用這些對象,從而使得可以方便地在不同的媒介中進行數據通信。
使用流的好處是,可以將處理某些數據(如某個對象中處理的數據)的輸入輸出定義成對流的操作。當想用對象傳輸數據時,只需要建立與數據來源相關聯的流,然后通過流向對象傳遞數據;對于不同來源的數據,只要用不同類型的流傳遞即可,而不用修改對象中的任何代碼。同樣當想將對象的數據傳遞出來的時候,只需首先建立與數據保存方式相關聯的流,再通過流將數據傳遞出來。程序員對流進行所有操作,而不用真正關心流的另一頭數據的真正流向,大大簡化了編程的復雜度,使得文件處理對于用戶的透明度更高。流不但可以處理文件,還可以處理動態內存、網絡數據等多種數據形式。在程序中利用流的方便性,可以大大提高編程的效率[3]。
Delphi提供了一個抽象的數據類型TStream來支持對字符或非字符等流數據的操作,這些數據通常來自文件、數據庫、內存對象、OLE對象,包括圖像、視頻、音頻等。TStream就像在內存中開辟的一個大小可變的臨時緩存區,它不僅能方便地對外部文件進行讀寫,還可以將流中的全部數據直接存入數據庫。在通常情況下,并不需要直接使用TStream類。TStream類有許多其他的派生類,對流式數據的讀寫封裝在VCL控件的方法。TStream類有3個基本的派生類:TFileStream類、TStringStream類和TMemoryStream類,它們分別用于處理文件系統對象、內存中的字符串對象和內存緩沖區對象。由于內存流可以減少磁盤操作,大大提高運行效率,程序中的相關操作均使用TMemoryStream來實現。
TStream類提供了很多重要的方法和屬性,但圖形數據流的讀寫主要用到兩個函數:
1) SaveToStream(Stream:TStream):將類中的數據寫到Stream的當前位置中;
2) LoadFromStream(Stream:TStream):從當前位置讀入Stream里的數據。
具體實現:1) 圖像數據存儲:將經過類型轉換的JPEG格式圖像寫到流中,然后用數據庫中的BLOB數據字段來讀入流中數據,實現圖像數據的存儲,具體過程如圖2(a);2) 圖像數據顯示:將數據庫中BLOB數據寫到流中,由TJPEG實例讀入流數據,然后用浮動窗口顯示,具體過程如圖2(b)。
2.3 圖像數據的顯示
數據庫的連接采用ADO(Active Date Object)方式,程序界面用DBGridEh作為數據控制組件來顯示數據,由于界面限制沒有足夠的空間來顯示每條記錄的圖像,因此采用浮動窗口實現動態顯示,隨著當前記錄的改變定位實現相應款式圖像的讀取與顯示。

(a)圖像數據存儲
(b)圖像數據顯示
圖2

圖3圖像實現效果圖
具體實現:在ADOQuery的AfterScroll事件中用流讀取圖像到TJPEGImage實例中,然后用自定義函數ShowPic將圖像以浮動窗口的形式顯示在界面上。自定義函數ShowPic用于實現浮動窗口顯示圖像,首先需定義一個Pic為HintWindow作為浮動窗口,設定其坐標位置,并運用其Canvas屬性畫出JPEG格式圖像且顯示圖像名稱。
浮動窗口獨立于界面,為使浮動窗口適時顯示而不影響其他界面的顯示,此處采用消息處理機制來控制該窗口的顯示。運用Delphi提供的應用程序內部發送消息方式SendMessage() API函數給指定窗口發送消息,發送的消息直接進入TWinControl.MainWndProc來處理消息,當該界面處于活動狀態則浮動窗口顯示,否則隱藏。
3 結束語
作者鑒于以上設計方案并結合實際研究項目,在Windows環境下,以SQL Server 2005為數據庫,采用Delphi7為開發語言研發了某針織企業的信息系統,其中有效地實現了服裝款式圖像的存儲與讀取,系統運行良好,驗證了方案的實用性,效果如圖3所示。
參考文獻:
[1] 胡勝利,鄭瑞娟.基于Delphi的數據庫圖形數據的管理[J].安徽理工大學學報(自然科學版),2006,26(4):72-75.
[2] 沈潔.SQL Server存儲圖像數據的探索與實現[J].電腦知識與技術,2005(3):13-14.
[3] 曹洋.Delphi7 經典問題解析[M].北京:中國水利水電出版社,2003.
[4] 薩師煊,王珊.數據庫系統概論[M].3版.北京:高等教育出版社,2000.
[5] 靳雁霞,陳學燕.大型數據庫中圖像數據的存儲方法研究.計算機與現代化,2007(7):87-89.
[6] 徐繼光.訪問MSSQL Server Image類型的數據的一種簡便方法[J].計算機工程,2000,26(8):190-191.