對於涉及圖像數據的數據庫應用程序
圖像數據的存取技術是一個關鍵
由於缺少技術文檔及DEMO例程演示
為此筆者在網上搜索了相關資料
有的根本不能用
有的過於繁雜
有的應用范圍太窄(如只能適用於BMP圖像)
有的寫得過於簡單理解起來十分困難
而且在網上這也是大家比較關心的一個問題
筆者對這個問題進行了反復實作和探索
下邊筆者將通過一個完整的簡單例子來說明如何保存和顯示SQL數據庫中的圖像數據(同時包括BMP和JPEG兩種格式)
一 創建演示數據庫
在SQL SERVER中新建一演示數據庫Demo並創建一數據表Picture結構如下
字段名
Data Type
Identity
Id
Int
Yes
Isbmp
Tinyint
Myimage
Image
字段Isbmp是用來記錄在Myimage中存入的圖像的類型(表JPEG表BMP其它值表無圖像)Isbmp數據類型選用整型Tinyint而末選用邏輯bit型主要是考慮到如下方法仍適用於ACCESS數據庫在SQL中打開表Picture添入幾條記錄Myimage圖像字段值暫不管字段Isbmp值隨便輸入和之外的其它數
二 窗口設計
在DELPHI中新建一個工程在FORM1上放置如表所示控件(考慮到TDBImage型控件不能正確顯示JPEG型圖像所以選用Timage型控件顯示所有類型圖像)
組件類別
組件屬性名
屬性值
用途說明
Timage
caption
Image
顯示圖像
name
Image
Stretch
True
Tbutton
caption
選擇圖像
選擇圖像
name
selectimage
Tbutton
caption
保存圖像
保存圖像到數據庫
name
savetodb
TADOConnection
caption
Adoconnection
創建與數據庫demo的連接
name
Adoconnection
Connectionstring
見備注
Connected
True
Loginprompt
False
Tadotable
Caption
Adotable
建立與表Picture
的連接
name
Adotable
Connection
Adoconnection
Tablename
Picture
Active
True
Tdatasource
Name
Datasource
建立數據源
Dataset
Adotable
Topenpicturedialog
Caption
Openpicturedialog
選擇圖像文件
Name
Openpicturedialog
Tdbgrid
Caption
Dbgrid
顯示記錄
Name
Dbgrid
Datasource
Datasource
備注
adoconnectionconnectstring :=
Provider=SQLOLEDB;Persist Security Info=False;User ID=sa;Initial Catalog=demo;
Data Source=Mysqlserver
Mysqlserver為SQL服務器的名稱請據實際情況更改
三 程序代碼(首先在單元文件接口部分的uses語句中添入JPEG單元引用)
圖像數據的選擇及保存
procedure TFormselectimageClick(Sender: TObject); //選擇圖像
begin
if openpicturedialogExecute then
imagePictureLoadFromFile(openpicturedialogFileName );
end;
procedure TFormsavetodbClick(Sender: TObject); //保存圖像
var
strm:tmemorystream;
ext:string;
begin
if imagepictureGraphic <> nil then //避免image中無圖像保存出錯
begin
ext:=extractfileext(openpicturedialogFileName ); //取出文件的擴展名
strm := tmemorystreamCreate ;
try
imagePictureGraphicSaveToStream(strm);
adotableEdit ;
strmPosition :=;
tblobfield(adotableFieldByName(myimage))LoadFromStream(strm);
//如需直接由文件保存可采用如下注釋行
//TBlobField(adotableFieldByName(myimage))LoadFromFile(OpenPictureDialogFileName);
//以下記錄保存到數據庫的圖像格式
if uppercase(ext) = BMP then
adotableFieldByName(isbmp)Value := //BMP型圖像數據
else if (uppercase(ext) = JPG) OR ( uppercase(ext) = JPEG) Then
adotableFieldByName(isbmp)Value := ; //JPEG型圖像數據
adotablePost ;
finally
strmFree ; //筆者發現如strm采用tblobstream類程序運行到該語句會出現問題
end;
end;
end;
圖像數據的讀取及顯示
從數據庫圖像字段中讀取數據然後在Image中把圖像顯示出來的程序代碼筆者先嘗試在Datasource的OnDataChange事件中來完成但會出錯後改寫在adotable的afterscroll事件中順利完成
procedure TFormadoTableAfterScroll(DataSet: TDataSet); //顯示圖像
var
strm:tadoblobstream;
jpegimage:tjpegimage;
bitmap:tbitmap;
begin
strm := tadoblobstreamCreate(tblobfield(adotablefieldbyname(MYIMAGE))bmread);
try //try
strmposition :=;
imagePictureGraphic := nil; //清除圖像
// BMPJPEG兩種圖像數據必需分別處理
if adotablefieldbyname(isbmp)asstring = then //BMP型圖像數據
begin //begin
bitmap := tbitmapCreate ;
try //try
bitmapLoadFromStream(strm);
imagePictureGraphic := bitmap;
finally
bitmapFree;
end; //end try
end //end begin
else if adotablefieldbyname(isbmp)asstring = then //JPEG型圖像數據
begin //begin
jpegimage := tjpegimageCreate ;
try //try
jpegimageLoadFromStream(strm);
imagePictureGraphic := jpegimage;
finally
jpegimageFree ;
end; //end try
end; //end begin
finally
strmFree ;
end; //end try
end;
如果你想將數據庫中的圖像導出到外部文件中可采用如下關鍵語句
imagePictureSaveToFile(FileName );
以上程序代碼不但適用於SQL數據庫而且完全適用於ACCESS數據庫但創建ACCESS數據庫時應注意圖像字段的數據類型應為OLE型數據庫創建完成之後再將Adoconnection連接到該ACCESS數據庫即可運行欲知詳細情況請索取源程序以上提供了DELPHI利用Tsteam類存取JPEGBMP圖像到數據庫的一種解決方案筆者爭取下文介紹DELPHI利用ASSIGN方法存取JPEGBMP圖像到數據庫的另一解決方案
以上程序代碼在DELPHI+SQL(或ACCESS)數據庫下運行通過
四另一解決方案
在上文中筆者提供了一種DELPHI存取JPEGBMP圖像到數據庫的解決方案雖然它適用於ACCESS和SQL數據庫但它並不適用於所有數據庫(比如PARADOX數據庫中的GRAPHIC圖像字段就不能采用該方法存取圖像數據)下文將介紹DELPHI利用ASSIGN方法存取JPEGBMP圖像到數據庫的另一解決方案來進行補充完善演示數據庫結構和窗口界面設計同前文不再重述將單元的相應程序代碼作如下更換
圖像數據的選擇及保存
procedure TformselectimageClick(Sender: TObject); //選擇圖像
begin
if openpicturedialogExecute then
imagePictureLoadFromFile(openpicturedialogFileName );
end;
procedure TformsavetodbClick(Sender: TObject); //保存圖像到數據庫
var
ext:string;
begin
if imagepictureGraphic <> nil then //避免image中無圖像保存出錯
begin
adotableEdit ;
adotableFieldByName(myimage)Assign(imagePictureGraphic);
//以下記錄保存到數據庫的圖像格式
ext:=extractfileext(openpicturedialogFileName ); //取出文件擴展名
if uppercase(ext) = BMP THEN
adotableFieldByName(isbmp)VALUE := //BMP型圖像數據
ELSE IF (UPPERCASE(EXT) = JPEG) OR (UPPERCASE(EXT) = JPG) THEN
adotableFieldByName(isbmp)VALUE := ; //JPEG型圖像數據
ADOTABLEPost ;
end;
end;
圖像數據的讀取及顯示
procedure TformADOTableAfterScroll(DataSet: TDataSet); //ADOTable的AfterScroll事件方法程序
var
jpegimage:tjpegimage;
begin
imagePictureGraphic :=nil;
//下邊BMPJPEG兩種圖像數據必需分別處理
if adotablefieldbyname(isbmp)Asstring = then //BMP型圖像數據
imagePicturebitmapAssign(adotablefieldbyname(myimage))
//上邊語句中的bitmap不能為graphic否則會出錯
else if adotablefieldbyname(isbmp)asstring = then //JPEG型圖像數據
begin //begin
jpegimage := tjpegimageCreate ; //通過jpegimage將圖像顯示在image否則會出錯
try
jpegimageAssign(adotablefieldbyname(myimage));
imagePictureGraphic :=jpegimage;
finally
jpegimageFree ;
end; //end try
end; //end begin
end;
注別忘了在單元文件接口部分的uses語句中添入JPEG單元引用
以上程序代碼在DELPHI+SQL(或ACCESS或PARADOX)數據庫下運行通過
From:http://tw.wingwit.com/Article/program/Delphi/201311/24918.html