9

如果我理解正确,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

4 回答 4

17

请参阅此SO 答案以从标题中检索文件内容。

或者您可以使用我们的TSynPicture,它将使用 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;
....
于 2011-06-06T12:12:24.167 回答
7

从这里开始,您可以轻松做到:http ://delphihaven.wordpress.com/2011/01/22/tip-detecting-graphic-formats/

于 2011-06-06T11:46:50.957 回答
2

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

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

于 2011-06-06T11:48:33.247 回答
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);
于 2011-06-06T13:19:50.400 回答