熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Delphi編程 >> 正文

Delphi存取圖像完整解決方案

2013-11-23 17:42:14  來源: Delphi編程 
 對於涉及圖像數據的數據庫應用程序圖像數據的存取技術是一個關鍵由於缺少技術文檔及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
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.