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