如何将BLOB流中的任意图像加载到TImage中?

时间:2011-06-06 11:42:13

标签: delphi stream delphi-2007 detect timage

如果我理解正确,TImage.LoadFromFile会确定文件扩展名中的图片类型。

有没有办法从TBlobStream中自动检测图像类型并带有原始图像?

我目前的代码:

procedure LoadImageFromStream(AImage: TImage; ADataSet: TDataSet);
var
  Stream: TStream;
begin
  Stream := ADataSet.CreateBlobStream(Field, bmRead);
  try
    AImage.Picture.Graphic.LoadFromStream(Stream);
  finally
    Stream.Free;
  end;
end

4 个答案:

答案 0 :(得分:16)

有关从标题中检索文件内容的信息,请参阅此SO answer

或者你可以使用我们的TSynPicture class,它可以在一个单独的类中使用Gdi +库处理所有类型的图片(bmp / gif / tiff / jpg / png)。因此,对于任何类型的图片,您的TPicture都可以成为这个独特的类。代码开销少于Jpeg或PNG Delphi单元。

var Pic: TSynPicture;

Pic := TSynPicture.Create;
Pic.LoadFromStream(aStream); // will load bmp/gif/tiff/jpeg/png content
AImage.Picture.Graphic := Pic;
....

答案 1 :(得分:7)

答案 2 :(得分:2)

实际上它是TPicture.LoadFromFile检测文件类型,它只使用文件扩展名。因此,您需要读取流的标头以检测文件类型。

另一方面,如果您知道将BLOB放入数据库时​​的格式是什么,则可以将该信息作为您自己的私有标头包含在BLOB中。

答案 3 :(得分:0)

看似魔术 TPicture对任意图像格式的狡猾处理实际上非常简单(不是说粗略)。从文件加载依赖于文件扩展名。从剪贴板加载 - 在剪贴板格式指示器上。看到?总是有格式标签指示TPicture TGraphicClass使用哪种数据,而TGraphic基类本身没有提供识别“自己的”数据流的机制,除了试错法。人们可能很好奇TPicture如何从DFM流加载自己,但它也不例外,这里是相关的实现摘录(版权代码仅供说明用途):

procedure TPicture.ReadData(Stream: TStream);
var
  {...}
  GraphicClass: TGraphicClass;
  LClassName: string;
  LBytes: TBytes;
  LNameLen: Byte;
begin
  Stream.Read(LNameLen, 1);
  SetLength(LBytes, LNameLen);
  Stream.Read(LBytes{$IFNDEF CLR}[0]{$ENDIF}, LNameLen);
  LClassName := TEncoding.UTF8.GetString(LBytes);

  GraphicClass := FileFormats.FindClassName(LClassName);