- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在将矢量图像从 SVG 文件绘制到 TImage。我想在运行时将所有路径的颜色更改为不同的一种颜色,但以下代码仅更改 SVG 的第一个路径的颜色。 SVG 中的所有路径都具有相同的颜色(黑色 - #000000)。有人知道如何改变所有路径的颜色吗?
...
img1: TImage; // TImage placed on the TForm1
...
procedure TForm1.DrawSVG(const aFileName: TFileName);
var
wSVGObject: IRSVGObject;
wSurface: IWin32Surface;
wContext: ICairoContext;
wRect: TRect;
begin
wSVGObject := TRSVGObject.Create(aFileName);
// img1 initialization
wRect.Left := 0;
wRect.Top := 0;
wRect.width := img1.width;
wRect.height := img1.height;
img1.Canvas.Brush.Color := clWhite;
img1.Canvas.FillRect(wRect);
wSurface := TWin32Surface.CreateHDC(img1.Canvas.Handle);
wContext := TCairoContext.Create(wSurface);
wContext.Antialias := CAIRO_ANTIALIAS_DEFAULT;
// try to change color of vector image, but only first path changes color
wContext.SetSourceRGB(0.5, 0.5, 0.5);
wContext.Rectangle(wRect.Left, wRect.Top, wRect.width, wRect.height);
wSurface.Flush;
wContext.FillPreserve;
wContext.RenderSVG(wSVGObject);
end;
最佳答案
我通过将svg文件(它像XML一样)加载到TStringList,用新颜色替换fill:#000000和描边:#000000,保存到TMemoryStream,然后使用TMemoryStream作为参数创建TRSVGObject来解决这个问题:
procedure TForm1.ChangeImageColor(const aMStream: TMemoryStream; const aFileName: TFileName; const aOldColor, aNewColor: TColor);
var
wStringList: TStringList;
wNewColor, wOldColor: string;
const
cHEX_NUMBERS = 6;
begin
wOldColor := IntToHex(ColorToRGB(aOldColor), cHEX_NUMBERS);
wNewColor := IntToHex(ColorToRGB(aNewColor), cHEX_NUMBERS);
wStringList := TStringList.Create;
try
wStringList.LoadFromFile(aFileName);
wStringList.Text := StringReplace(wStringList.Text, 'fill:#' + wOldColor, 'fill:#' + wNewColor,
[rfReplaceAll, rfIgnoreCase]);
wStringList.Text := StringReplace(wStringList.Text, 'stroke:#' + wOldColor, 'stroke:#' + wNewColor,
[rfReplaceAll, rfIgnoreCase]);
wStringList.SaveToStream(aMStream);
finally
FreeAndNil(wStringList);
end;
end;
然后:
wMemStream := TMemoryStream.Create;
try
if aOldColor <> aNewColor then
ChangeImageColor(wMemStream, aFileName, aOldColor, aNewColor)
else
wMemStream.LoadFromFile(aFileName);
wSVGObject := TRSVGObject.Create(wMemStream);
...
...
// try to change color of vector image, but only first path changes color
// wContext.SetSourceRGB(0.5, 0.5, 0.5);
// wContext.Rectangle(wRect.Left, wRect.Top, wRect.width, wRect.height);
// wSurface.Flush;
// wContext.FillPreserve;
wContext.RenderSVG(wSVGObject);
finally
FreeAndNil(wMemStream);
end;
关于delphi - 使用 cairo、librsvg 和 delphi 绘制 SVG,更改所有路径的颜色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32045470/
可用于 librsvg-2.0 的 vapi 文件包含的内容比实际库包含的要少得多 vapi: http://valadoc.org/#!wiki=librsvg-2.0/index 图书馆:http
我在我的 C 文件中使用 librsvg 来栅格化 SVG,但是一旦我包含 rsvg.h,我就开始收到以下错误: /usr/include/librsvg-2.0/librsvg/rsvg.h:29:
我正在尝试使用 librsvg 呈现一些以 SVG 格式生成的图表(更大元素的一部分)。然而,渲染结果看起来与在 Web 浏览器中打开 SVG 文件时的外观截然不同。 通过一点一点地分解 SVG 文件
是否可以在通过 librsvg 获取其像素缓冲区之前缩放 svg?我可以看到类似 rsvg_pixbuf_from_file_at_zoom 的 API,但它被标记为已弃用。 还有其他方法吗?如果可能
最近我一直在尝试编写一个绘制 SVG 图片的应用程序。我正在使用 librsvg 库来做到这一点。我在某处找到了一个静态库文件“librsvg-2.dll.a”,它似乎可以解决问题。 问题是它在 rs
我正在使用 librsvg 将 SVG 文件渲染到开罗上下文。之后,我使用 Pango “手动”在顶部渲染一些文本。 渲染 SVG 时,我收到 Pango 警告,指出它无法加载字体: “无法加载字体“
我正在项目中使用一些代码;特别是一个获取 SVG 图像并从中生成 png 的函数。 我有这个: typedef std::vector BinaryBuffer; BinaryBuff
我试图用 Python 的 ctypes 包装 librsvg 的基本功能,但我遇到了段错误。 C: // pycairo excerpt typedef struct { PyObject_HE
我知道这个问题在这里有几个答案版本(例如: ImageMagick convert SVG to PNG not working with RSVG enabled ),但实际上我找不到真正解决我的确
我正在将矢量图像从 SVG 文件绘制到 TImage。我想在运行时将所有路径的颜色更改为不同的一种颜色,但以下代码仅更改 SVG 的第一个路径的颜色。 SVG 中的所有路径都具有相同的颜色(黑色 -
当栅格化 svg 文件时,我希望能够为生成的 png 文件设置宽度和高度。使用以下代码,仅将 Canvas 设置为所需的宽度和高度,原始 svg 文件尺寸的实际图像内容呈现在 (500, 600) C
我是一名优秀的程序员,十分优秀!