使用 TSVGIconImage 将 SVG 导出到位图时设置透明度颜色
Set the transparency color when exporting SVGs to Bitmap using TSVGIconImage
我使用 TSVGImageIcon 读取 SVG 矢量图像,我创建了这个例程来将图像保存为特定大小的位图:
function SVG2Bitmap(Imatge: TBytes; x, y: integer): TBytes;
var SVG: TSVGIconImage;
Stream: TBytesStream;
Bitmap: TBitmap;
Resultat: TBytesStream;
Form: TForm;
begin
try
SVG := nil;
Form := nil;
Stream := nil;
Bitmap := nil;
Resultat := nil;
Stream := TBytesStream.Create(Imatge);
Stream.Position := 0;
Form := TForm.Create(nil); // The SVGIconImage raises an error if not inside a Form
SVG := TSVGIconImage.Create(Form);
SVG.Parent := Form;
SVG.Stretch := True;
SVG.Proportional := True;
SVG.LoadFromStream(Stream);
SVG.Width := x;
SVG.Height := y;
Bitmap := TBitmap.Create;
Bitmap.SetSize(x, y);
SVG.PaintTo(Bitmap.Canvas, 0, 0);
Resultat := TBytesStream.Create;
Bitmap.SaveToStream(Resultat);
Result := Resultat.Bytes;
finally
if Assigned(SVG) then try SVG.Free except end;
if Assigned(Form) then try Form.Free except end;
if Assigned(Bitmap) then try Bitmap.Free except end;
if Assigned(Stream) then try Stream.Free except end;
if Assigned(Resultat) then try Resultat.Free except end;
end;
end;
效果很好,但它将透明区域填充为灰色,我希望它们为白色。你能推荐一种在设置透明度颜色时将 SVG 导出到位图的方法,还是我应该循环遍历位图,将灰色像素更改为白色?
谢谢。
原来SVGIconImage使用父容器的颜色作为透明色。因此,将 Form.Color 更改为我选择的 TransparencyColor 就可以了。
function SVG_2_Bitmap(ImageSVG: TBytes; x, y: integer; TransparencyColor: TColor = clWhite): TBytes;
var SVG: TSVGIconImage;
Stream, Resultat: TBytesStream;
Bitmap: TBitmap;
Form: TForm;
begin
SVG := nil;
Form := nil;
Stream := nil;
Bitmap := nil;
Resultat := nil;
try
Stream := TBytesStream.Create(ImageSVG);
Form := TForm.Create(nil);
Form.Color := TransparencyColor;
SVG := TSVGIconImage.Create(Form);
SVG.Parent := Form;
SVG.Proportional := True;
SVG.LoadFromStream(Stream);
SVG.Width := x;
SVG.Height := y;
Bitmap := TBitmap.Create;
Bitmap.SetSize(x, y);
SVG.PaintTo(Bitmap.Canvas, 0, 0);
Resultat := TBytesStream.Create;
Bitmap.SaveToStream(Resultat);
Result := Resultat.Bytes;
finally
try SVG.Free except end;
try Form.Free except end;
try Bitmap.Free except end;
try Stream.Free except end;
try Resultat.Free except end;
end;
end;
感谢您的所有建议。
我使用 TSVGImageIcon 读取 SVG 矢量图像,我创建了这个例程来将图像保存为特定大小的位图:
function SVG2Bitmap(Imatge: TBytes; x, y: integer): TBytes;
var SVG: TSVGIconImage;
Stream: TBytesStream;
Bitmap: TBitmap;
Resultat: TBytesStream;
Form: TForm;
begin
try
SVG := nil;
Form := nil;
Stream := nil;
Bitmap := nil;
Resultat := nil;
Stream := TBytesStream.Create(Imatge);
Stream.Position := 0;
Form := TForm.Create(nil); // The SVGIconImage raises an error if not inside a Form
SVG := TSVGIconImage.Create(Form);
SVG.Parent := Form;
SVG.Stretch := True;
SVG.Proportional := True;
SVG.LoadFromStream(Stream);
SVG.Width := x;
SVG.Height := y;
Bitmap := TBitmap.Create;
Bitmap.SetSize(x, y);
SVG.PaintTo(Bitmap.Canvas, 0, 0);
Resultat := TBytesStream.Create;
Bitmap.SaveToStream(Resultat);
Result := Resultat.Bytes;
finally
if Assigned(SVG) then try SVG.Free except end;
if Assigned(Form) then try Form.Free except end;
if Assigned(Bitmap) then try Bitmap.Free except end;
if Assigned(Stream) then try Stream.Free except end;
if Assigned(Resultat) then try Resultat.Free except end;
end;
end;
效果很好,但它将透明区域填充为灰色,我希望它们为白色。你能推荐一种在设置透明度颜色时将 SVG 导出到位图的方法,还是我应该循环遍历位图,将灰色像素更改为白色?
谢谢。
原来SVGIconImage使用父容器的颜色作为透明色。因此,将 Form.Color 更改为我选择的 TransparencyColor 就可以了。
function SVG_2_Bitmap(ImageSVG: TBytes; x, y: integer; TransparencyColor: TColor = clWhite): TBytes;
var SVG: TSVGIconImage;
Stream, Resultat: TBytesStream;
Bitmap: TBitmap;
Form: TForm;
begin
SVG := nil;
Form := nil;
Stream := nil;
Bitmap := nil;
Resultat := nil;
try
Stream := TBytesStream.Create(ImageSVG);
Form := TForm.Create(nil);
Form.Color := TransparencyColor;
SVG := TSVGIconImage.Create(Form);
SVG.Parent := Form;
SVG.Proportional := True;
SVG.LoadFromStream(Stream);
SVG.Width := x;
SVG.Height := y;
Bitmap := TBitmap.Create;
Bitmap.SetSize(x, y);
SVG.PaintTo(Bitmap.Canvas, 0, 0);
Resultat := TBytesStream.Create;
Bitmap.SaveToStream(Resultat);
Result := Resultat.Bytes;
finally
try SVG.Free except end;
try Form.Free except end;
try Bitmap.Free except end;
try Stream.Free except end;
try Resultat.Free except end;
end;
end;
感谢您的所有建议。