【问题标题】:Open and edit SVG files using C/C++使用 C/C++ 打开和编辑 SVG 文件
【发布时间】:2013-06-20 09:14:03
【问题描述】:

我正在开发一个必须使用 SVG 形状来创建图表的编辑器。 为了打开和显示 SVG,我使用了 librsvg,它实际上非常好,但仅用于渲染 SVG 而不是编辑它们。

我想访问形状的属性并更改它们的值(即宽度、大小)。

我使用 Cairo 将它们绘制到屏幕上,但我不想使用 cairo 的缩放功能,因为它与更改形状的大小不同。

我在 Win32 上使用 C++ builder XE3。

有谁知道我可以使用的好的 C/C++ 库吗?

感谢您的帮助。

【问题讨论】:

  • 取决于您的需要,但任何标准的开箱即用 XML 解析器都应该为您提供 svg 文档方面的功能。
  • 您要编辑哪些标签?只是rect 还是全部?
  • Erik Dahlström:当然,解析 XML 很容易,但最好的库是解析 XML 并在内存中构建由结构组成的树,这些结构代表 SVG 文件中定义的形状,然后修改形状的属性会很容易。
  • cubuspl42:大部分,rect,g,style,color,...

标签: c++ c windows svg librsvg


【解决方案1】:

Cairo 的 scale 函数可缩放整个坐标系,但如果您首先转换到形状的原点,则可以在单个形状上使用它;如果您将这些更改与保存/恢复对括起来,它只会影响在此范围内完成的绘图。在描边之前重置矩阵允许您在不更改描边宽度的情况下调整绘图的大小(或者,您可以将描边宽度调整为 1/缩放因子)。

cairo_matrix_t m;
cairo_get_matrix(cr, &m);
cairo_save(cr);
    cairo_translate(shape_x, shape_y);
    cairo_scale(shape_w, shape_h);
        //cairo_move_to(cr, x, y);   //perform the actual drawing
        //cairo_line_to(cr, x, y);
        //cairo_closepath(cr);
    cairo_set_matrix(cr, &m);
    cairo_stroke(cr);
cairo_restore(cr);

如果像这样明确地重置矩阵,您实际上不再需要保存/恢复(平移和缩放除了矩阵之外不会影响任何东西,并且笔划会重置路径)。

【讨论】:

  • 我知道,但是渲染不一样。因为我不会更改某些形状的宽度和高度,但不会更改笔画大小。并且缩放功能也可以缩放边框大小......并且它并不能满足我改变颜色的需要。感谢您的回复。
  • 这可能是可以修复的。由于描述路径和执行笔划发生在不同的时间,您可以更改中间的矩阵。
  • 有可能。但是我必须提取一些在 .c 文件或私有 .h 文件中定义的私有结构,这意味着在 librsvg 的未来版本中,我必须检查这些结构是否仍然相同。这就是为什么我要寻找一个能让我访问其内部结构而无需破解它的库。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-05
  • 1970-01-01
  • 1970-01-01
  • 2022-06-15
相关资源
最近更新 更多