是否有 TSVGImage class 通过 TMemoryStream 将 SVG 图像加载到 TImage.Picture?

Is there a TSVGImage class to load an SVG image via TMemoryStream into a TImage.Picture?

我们在应用程序中使用 SVG 图像。

这是我们的 JPEG 图像代码(它是我们应用程序的工作示例,类似于 this):

Var
  memoryStreamFile: TMemoryStream;
  blobFieldFile:TBlobField;  
  JPEGImage: TJPEGImage;
  //ImageJPEG:TImage is a TImage on the form

blobFieldFile:=ClientDataSet.fieldbyName('Image') as TblobField ;
memoryStreamFile := TMemoryStream.Create;

blobFieldFile.SaveToStream(memoryStreamFile);
memoryStreamFile.Position:=0;

JPEGImage := TJPEGImage.Create;
try
  JPEGImage.LoadFromStream(memoryStreamFile);
  ImageJPEG.Picture.Assign(JPEGImage);
finally
  JPEGImage.Free;
end; 

我想对 SVG 图像执行与上述相同的操作:

Var
  memoryStreamFile: TMemoryStream;
  blobFieldFile:TBlobField;  
  SVGImage: TSVGImage; -->>This does not exist
  //ImageSVG:TImage is a TImage on the form

blobFieldFile:=ClientDataSet.fieldbyName('Image') as TblobField ;
memoryStreamFile := TMemoryStream.Create;

blobFieldFile.SaveToStream(memoryStreamFile);
memoryStreamFile.Position:=0;

SVGImage := TSVGImage.Create;//Sample of how I would envision it to work. Obviously this does not exist
try
  SVGImage.LoadFromStream(memoryStreamFile);
  ImageSVG.Picture.Assign(SVGImage);
finally
  SVGImage.Free;
end; 

我们基本上以文本格式生成 SVG 代码,并希望将文本加载到 TImage

有没有办法流式传输我没有看到的内容?

我知道我可以将我们的 SVG 文本保存到文件中,然后执行 TImage.Picture.LoadFromFile(),但我更喜欢执行 TImage.Picture.LoadFromStream()

我知道还有其他组件可以使用,即 Delphi SVG(我们目前正在使用它)。

你应该使用 ClientDataSet.CreateBlobStream() 而不是 blobFieldFile.SaveToStream(),那么你根本不需要 TMemoryStream:

var
  Blob: TField;
  Stream: TStream;
  JPEG: TJPEGImage;
begin
  Blob := ClientDataSet.FieldByName('Image');
  Stream := ClientDataSet.CreateBlobStream(Blob, bmRead);
  try
    JPEG := TJPEGImage.Create;
    try
      JPEG.LoadFromStream(Stream);
      Image.Picture.Assign(JPEG);
    finally
      JPEG.Free;
    end; 
  finally
    Stream.Free;
  end;
end; 

至于加载SVG图片,只需要TGraphic class支持SVG即可。 VCL 本身没有这样的 class,但是 Delphi SVG package you are already using does - TSVG2Graphic:

var
  Blob: TField;
  Stream: TStream;
  SVG: TSVG2Graphic;
begin
  Blob := ClientDataSet.FieldByName('Image');
  Stream := ClientDataSet.CreateBlobStream(Blob, bmRead);
  try
    SVG := TSVG2Graphic.Create;
    try
      SVG.LoadFromStream(Stream);
      Image.Picture.Assign(SVG);
    finally
      SVG.Free;
    end; 
  finally
    Stream.Free;
  end;
end;