Delphi 从TStream将任何图像加载到TImage中
我想创建一个类来查看任何格式的图像。图像存储在blob字段中 我创建:Delphi 从TStream将任何图像加载到TImage中,delphi,stream,timage,Delphi,Stream,Timage,我想创建一个类来查看任何格式的图像。图像存储在blob字段中 我创建: const ImageType:array [0..6] of TGraphicClass=(TJpegimage, TBitmap, TWICImage, TGIFImage, TPNGImage, TMetafile,TIcon); procedure tImageView.LoadFromStream(AStrm: TSt
const
ImageType:array [0..6] of TGraphicClass=(TJpegimage, TBitmap, TWICImage,
TGIFImage, TPNGImage, TMetafile,TIcon);
procedure tImageView.LoadFromStream(AStrm: TStream);
var
Ext: string;
NewGraphic: TGraphic;
GraphicClass: TGraphicClass;
i:integer;
IsLoaded:boolean;
begin
IsLoaded:=false;
for i:=0 to Length(ImageType)-1 do begin
try
GraphicClass:=ImageType[i];
NewGraphic := GraphicClass.Create;
if Astrm.Size<>0 then begin
NewGraphic.LoadFromStream(Astrm);
IsLoaded:=true;
Break;
end;
except
try
NewGraphic.Free;
finally
end;
end;
end;
if Isloaded then begin
fImg.Picture.Assign(NewGraphic);
NewGraphic.Free;
end
else begin
raise EInvalidGraphic.Create('Unknow format image!!!!!!!');
end;
end;
const
ImageType:TGraphicClass=(TJpegimage、TBitmap、TWICImage、,
TGIFImage、TPNGImage、TMetafile、TIcon);
程序tImageView.LoadFromStream(AStrm:TStream);
变量
外部:字符串;
新图形:TGraphic;
GraphicClass:TGraphicClass;
i:整数;
IsLoaded:布尔值;
开始
IsLoaded:=假;
对于i:=0到长度(ImageType)-1,请不要开始
尝试
GraphicClass:=图像类型[i];
NewGraphic:=GraphicClass.Create;
如果是Astrm.Size0,则开始
NewGraphic.LoadFromStream(Astrm);
IsLoaded:=真;
打破
结束;
除了
尝试
免费;
最后
结束;
结束;
结束;
如果已加载,则开始
图.图片.分配(新图形);
免费;
结束
否则开始
提高EInvalidGraphic.Create('未知格式图像!!!!!!!');
结束;
结束;
如果“ImageType”中的第一种图像类型不正确,则和正确类型下一个索引运行异常。为什么?我必须调用一些init过程?您需要设置
Astrm.Position:=0每次在NewGraphic:=graphicsclass.Create
之后的循环中进行编码>。顺便说一句,我不会用这种方法。更好的解决方案是检查流头签名。在调用LoadFromStream
之前,需要将流位置设置回开头。但这是一种有点糟糕的方法。更好的办法是阅读图像的签名,并以这种方式决定类型。便宜多了。而且try/finally
有点麻烦。顺便说一句,TWICImage
能够处理所有这些格式。因此,您可以在不使用其他图形类的情况下使用它。