程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> 更多關於編程 >> Delphi存取圖像完整解決方案

Delphi存取圖像完整解決方案

編輯:更多關於編程

      對於涉及圖像數據的數據庫應用程序,圖像數據的存取技術是一個關鍵。由於缺少技術文檔及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;

    1. 上一頁:
    2. 下一頁:
    Copyright © 程式師世界 All Rights Reserved