對於涉及圖像數據的數據庫應用程序,圖像數據的存取技術是一個關鍵。由於缺少技術文檔及DEMO例程演示,為此筆者在網上搜索了相關資料,有的根本不能用,有的過於繁雜,有的應用范圍太窄(如只能適用於BMP圖像),有的寫得過於簡單理解起來十分困難。。。而且在網上這也是大家比較關心的一個問題。筆者對這個問題進行了反復實作和探索,下邊筆者將通過一個完整的簡單例子來說明如何保存和顯示SQL數據庫中的圖像數據(同時包括BMP和JPEG兩種格式)。
一、 創建演示數據庫
在SQL SERVER中新建一演示數據庫:Demo,並創建一數據表Picture1,結構如下:
字段名 Dtata Type Identity
Id Int Yes
Isbmp Tinyint
Myimage Image
字段Isbmp是用來記錄在Myimage中存入的圖像的類型(0表JPEG,1表BMP,其它值表無圖像),Isbmp數據類型選用整型 Tinyint而末選用邏輯bit型主要是考慮到如下方法仍適用於ACCESS數據庫。在SQL中打開表Picture1,添入幾條記錄,Myimage 圖像字段值暫不管,字段Isbmp值隨便輸入0和1之外的其它數。
二、 窗口設計
在Delphi中新建一個工程,在FORM1上放置如表所示控件(考慮到TDBImage型控件不能正確顯示JPEG型圖像,所以選用Timage型控件顯示所有類型圖像)。
組件類別 組件屬性名 屬性值 用途說明
Timage caption Image1 顯示圖像
name Image1
Stretch True
Tbutton caption 選擇圖像 選擇圖像
name selectimage
Tbutton caption 保存圖像 保存圖像到數據庫
name savetodb
TADOConnection caption Adoconnection1 創建與數據庫demo的連接
name Adoconnection1
Connectionstring 見備注
Connected True
Loginprompt False
Tadotable Caption Adotable1 建立與表Picture1的連接
name Adotable1
Connection Adoconnection1
Tablename Picture1
Active True
Tdatasource Name Datasource1 建立數據源
Dataset Adotable1
Topenpicturedialog Caption Openpicturedialog1 選擇圖像文件
Name Openpicturedialog1
Tdbgrid Caption Dbgrid1 顯示記錄
Name Dbgrid1
Datasource Datasource1
備注:
adoconnection1.connectstring :=
'Provider=SQLOLEDB.1;Persist Security Info=False;User ID=sa;Initial Catalog=demo;
Data Source=Mysqlserver'
Mysqlserver為SQL服務器的名稱請據實際情況更改。
三、 程序代碼(首先在單元文件接口部分的uses語句中添入JPEG單元引用)
1. 圖像數據的選擇及保存
procedure TForm1.selectimageClick(Sender: TObject); //選擇圖像
begin
if openpicturedialog1.Execute then
image1.Picture.LoadFromFile(openpicturedialog1.FileName );
end;
procedure TForm1.savetodbClick(Sender: TObject); //保存圖像
var
strm:tmemorystream;
ext:string;
begin
if image1.picture.Graphic <> nil then //避免image1中無圖像保存出錯
begin
ext:=extractfileext(openpicturedialog1.FileName ); //取出文件的擴展名
strm := tmemorystream.Create ;
try
image1.Picture.Graphic.SaveToStream(strm);
adotable1.Edit ;
strm.Position :=0;
tblobfield(adotable1.FieldByName('myimage')).LoadFromStream(strm);
//如需直接由文件保存可采用如下注釋行
//TBlobField(adotable1.FieldByName('myimage')).LoadFromFile(OpenPictureDialog1.FileName);
//以下記錄保存到數據庫的圖像格式
if uppercase(ext) = '.BMP' then
adotable1.FieldByName('isbmp').Value := 1 //BMP型圖像數據
else if (uppercase(ext) = '.JPG') OR ( uppercase(ext) = '.JPEG') Then
adotable1.FieldByName('isbmp').Value := 0; //JPEG型圖像數據
adotable1.Post ;
finally
strm.Free ; //筆者發現如strm采用tblobstream類,程序運行到該語句會出現問題
end;
end;
end;