delphi 数据库中的图像

w6lpcovy  于 2023-05-12  发布在  其他
关注(0)|答案(1)|浏览(143)

我的程序管理“项目”(把它们想象成庄严的住宅),并将每个项目关联到零个、一个或多个图像。到目前为止,这些都在数据库之外。数据库中的项目通过文件名和路径指向图像。图像保存在专用文件夹树中。现在需要将图像移动到数据库本身。需要处理的图像类型包括:jpeg(最常见,有时高达4 Mb)bmp(也很常见,而且相当大)png emf wmf gif(仅静态,罕见,但确实存在)。
当前,当文件与项目相关联时,除了在图像数据库表中创建条目之外,不会对图像执行任何操作。当用户查看项目时,使用ShellBrowser显示图像缩略图以访问文件并生成在屏幕上显示的96 x 96缩略图位图。
我的计划是将图像和缩略图作为每条记录的两个新BLOB字段存储在Images表中,即Full Image和Thumbnail,这两个字段都是位图。
这是我第一次尝试在数据库中的图像,所以请容忍我,因为我试图加快速度。
问题1:下面的代码段是否将上述6种文件类型转换为全图像位图?似乎是这样。

uses 
  Graphics, Jpeg, pngimage, GIFImg; 

procedure TForm1.Button1Click (Sender: TObject); 
var 
  Picture: TPicture; 
  Bitmap: TBitmap; 
begin 
  Picture := TPicture.Create; 
  try 
    Picture.LoadFromFile('C:\imagedata.dat'); 
    Bitmap := TBitmap.Create; 
    try 
      Bitmap.Width := Picture.Width; 
      Bitmap.Height := Picture.Height; 
      Bitmap.Canvas.Draw(0, 0, Picture.Graphic); 
      Bitmap.SaveToFile('C:\test.bmp'); 
    finally 
      Bitmap.Free; 
    end; 
  finally 
    Picture.Free; 
  end; 
end;

问题2:如何使用TStream或TMemoryStream将位图移动到Blob字段中?优点和问题一个相对于另一个。将位图移动到流和从流移动到BLOB的代码??
问题3:我的感觉是,将原始文件存储在Blob字段中会占用更少的空间,但更难在屏幕上显示。有什么想法吗

56lgkhnf

56lgkhnf1#

  1. TPicture.LoadFromFile()使用文件扩展名来知道使用哪个TGraphic类来加载数据。除非您创建了自定义类,否则没有一个标准类使用.dat
    1.使用TDataSet.CreateBlobStream()TGraphic.SaveToStream()/LoadFromStream()。不过,我不会强行将所有图像转换为BMP进行存储。这会使数据库膨胀。JPG和PNG要紧凑得多。
    1.存储在斑点中的图像可以以TDBImage显示。或者,您可以自己加载图像,然后将其分配给TImage

相关问题