Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 从TStream将任何图像加载到TImage中_Delphi_Stream_Timage - Fatal编程技术网

Delphi 从TStream将任何图像加载到TImage中

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

我想创建一个类来查看任何格式的图像。图像存储在blob字段中

我创建:

 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:=0NewGraphic:=graphicsclass.Create
之后的循环中进行编码>。顺便说一句,我不会用这种方法。更好的解决方案是检查流头签名。在调用
LoadFromStream
之前,需要将流位置设置回开头。但这是一种有点糟糕的方法。更好的办法是阅读图像的签名,并以这种方式决定类型。便宜多了。而且
try/finally
有点麻烦。顺便说一句,
TWICImage
能够处理所有这些格式。因此,您可以在不使用其他图形类的情况下使用它。