首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> Delphi

Delphi 圖像存取資料庫完整方案:Stream 方式處理 SQL/Access 的 JPEG 與 BMP

     編輯:Delphi

方案概覽與資料庫設計

針對 SQL Server 與 Access 資料庫,利用 TStream 衍生類別(TMemoryStream、TADOBlobStream)實現 JPEG/BMP 圖像的儲存與讀取。資料表結構:

  • Id (Int, Identity)
  • IsBmp (TinyInt) — 0=JPEG, 1=BMP, 其他=無圖像
  • MyImage (Image/OLE Object) — 二進位圖像資料

介面元件:TImage(顯示,Stretch=True)、TButton(選擇/儲存)、TADOConnection、TADOTable、TDataSource、TDBGrid、TOpenPictureDialog。註: Access 圖像欄位型別須為 OLE Object。

圖像選擇與儲存(Stream 寫入)

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
  begin
    Ext := UpperCase(ExtractFileExt(OpenPictureDialog1.FileName));
    Strm := TMemoryStream.Create;
    try
      Image1.Picture.Graphic.SaveToStream(Strm); // 圖像序列化至記憶體流
      ADOTable1.Edit;
      Strm.Position := 0;
      TBlobField(ADOTable1.FieldByName('MyImage')).LoadFromStream(Strm); // 寫入資料庫
      // 替代方案:直接從檔案 LoadFromFile(OpenPictureDialog1.FileName)
      if Ext = '.BMP' then
        ADOTable1.FieldByName('IsBmp').Value := 1
      else if (Ext = '.JPG') or (Ext = '.JPEG') then
        ADOTable1.FieldByName('IsBmp').Value := 0;
      ADOTable1.Post;
    finally
      Strm.Free; // 注意:TBlobStream 在此處 Free 會出錯,須用 TMemoryStream
    end;
  end;
end;

圖像讀取與顯示(Stream 讀出)

嘗試在 DataSource.OnDataChange 失敗,改用 ADOTable.AfterScroll 成功:

procedure TForm1.ADOTable1AfterScroll(DataSet: TDataSet);
var Strm: TADOBlobStream; JpegImg: TJPEGImage; Bmp: TBitmap;
begin
  Strm := TADOBlobStream.Create(TBlobField(ADOTable1.FieldByName('MyImage')), bmRead);
  try
    Strm.Position := 0;
    Image1.Picture.Graphic := nil;
    // BMP 與 JPEG 必須分別處理
    if ADOTable1.FieldByName('IsBmp').AsString = '1' then // BMP
    begin
      Bmp := TBitmap.Create;
      try
        Bmp.LoadFromStream(Strm);
        Image1.Picture.Graphic := Bmp;
      finally Bmp.Free; end;
    end
    else if ADOTable1.FieldByName('IsBmp').AsString = '0' then // JPEG
    begin
      JpegImg := TJPEGImage.Create;
      try
        JpegImg.LoadFromStream(Strm);
        Image1.Picture.Graphic := JpegImg;
      finally JpegImg.Free; end;
    end;
  finally Strm.Free; end;
end;

匯出圖像至檔案

Image1.Picture.SaveToFile(FileName);

適用範圍與後續擴展

  • 適用 SQL Server(Image 欄位)與 Access(OLE Object 欄位)
  • 不適用 Paradox Graphic 欄位,後續文章將介紹 Assign 方法替代方案
  • 核心技術:TGraphic.SaveToStream/LoadFromStream 多型序列化、TBlobField.LoadFromStream/SaveToStream 資料庫交互

測試環境:Delphi 6.0 + SQL Server / Access。完整源碼可依此架構擴展至多圖像、縮圖預覽、格式轉換等功能。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved