針對 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。
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;
嘗試在 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);
TGraphic.SaveToStream/LoadFromStream 多型序列化、TBlobField.LoadFromStream/SaveToStream 資料庫交互測試環境:Delphi 6.0 + SQL Server / Access。完整源碼可依此架構擴展至多圖像、縮圖預覽、格式轉換等功能。