Существует ли класс TSVGImage для загрузки изображения SVG через TMemoryStream в TImage.Picture? - PullRequest
1 голос
/ 24 марта 2020

Мы используем изображения 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().

Я знаю, что есть другие компоненты которые могут быть использованы, ie Delphi SVG (в настоящее время мы используем это).

1 Ответ

3 голосов
/ 25 марта 2020

Вы должны использовать 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 класс, поддерживающий SVG. VCL не имеет такого класса, доступного изначально, но пакет Delphi SVG , который вы уже используете, делает - 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; 
...