是否有 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;
我们在应用程序中使用 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;