【问题标题】:Scaling SVG objects defined in pixels to physical units?将以像素定义的SVG对象缩放到物理单位?
【发布时间】:2012-05-23 23:49:23
【问题描述】:

我定义了一个宽度和高度为“297mm”和“210mm”的 SVG 元素,并且没有视图框。我这样做是因为我想在 A4 视口中工作,但我想以像素为单位创建元素。

在某些时候,我需要放大以像素为单位定义的对象,以使其适合 A4 页面的一部分。例如,我可能有一个 100 像素宽的对象,我想将其水平缩放到 30 毫米。

这可能吗?我想我需要第二个带有新坐标系的容器,但我找不到任何方法。

编辑

似乎我(或 SVG)误解了像素是什么。我意识到我可以将一条线的大小调整为 100%,然后使用 getBBox 获取它的像素大小以找到所需的缩放比例。我编写了这段代码并在 2 台客户端上运行,一台使用 1280x1024 显示器 (80dpi),另一台使用 1680x1050 LCD (90dpi):

function getDotsPerInch() {
   var hgroup, vgroup, hdpi, vdpi;

   hgroup = svgDocument.createElementNS(svgNS, "g");
   vgroup = svgDocument.createElementNS(svgNS, "g");
   svgRoot.appendChild(hgroup);
   svgRoot.appendChild(vgroup);

   drawLine(hgroup, 0, 100, "100%", 100, "#202020", 1, 1);
   drawLine(vgroup, 100, 0, 100, "100%", "#202020", 1, 1);

   hdpi = hgroup.getBBox().width  * 25.4 / WIDTH;
   vdpi = vgroup.getBBox().height * 25.4 / HEIGHT;

   drawText(hgroup, "DPI, horizontal: " + hdpi.toFixed(2), 100, 100);
   drawText(hgroup, "DPI, vertical:   " + vdpi.toFixed(2), 100, 120);
}

IE9、FF、Opera 和 Chrome 都同意两台显示器在水平和垂直方向上都是 96 dpi(尽管 Opera 稍微不准确),而 Safari 在两者上都报告 0 dpi监视器。所以 svg 似乎只是将“像素”定义为“96dpi”。一些快速的谷歌搜索似乎证实了这一点,虽然我还没有找到任何确定的东西,而且大多数点击给出 90dpi,96dpi 作为 FF 变体。

【问题讨论】:

  • 为什么有些人认为这需要关闭?
  • 哇——这个问题已经有一年的历史了,提出了一个关于 SVG dpi 定义的重要观点,显然与 SVG 相关,并显示了一些研究工作。而且,尽管如此,有 5 个人刚刚决定将其作为离题关闭,并且有人刚刚投了反对票。有人愿意解释吗?
  • 其中一个已经 16 岁,而且似乎没有一个对 SVG 感兴趣...
  • @EML 注意:这已经被讨论过in the Tavern on the Meta chatroom(通过接下来的两天页面查看我的 cmets)。我完全同意你的看法,并感谢你的挫败感,但请不要发表与年龄相关的言论,比如你最新评论中的言论。我认为您的问题没有被任何人否决:作为离题关闭的问题会收到自动投反对票,现在已被自动删除。
  • 网络技术中的像素是“CSS 像素”,它使用 96 dpi 显示作为标准。请查看 CSS3 值:w3.org/TR/2013/CR-css3-values-20130730(忽略弃用警告 - 这部分仍然有效)

标签: svg


【解决方案1】:

您可以嵌套<svg> 元素并在子元素上使用viewBox 属性来获得新的坐标系。给子<svg> 元素 x、y、width 和 height 属性,您希望它在父坐标系中出现在父元素上的位置。

【讨论】:

  • 谢谢 - 我最终意识到了这一点,尝试了它,得出的结论是它没用。如果我设置了一个新的坐标系统,视口设置为宽度“297mm”,高度设置为“210mm”,viewBox 设置为0 0 297 210,那么 (1) 如果您从旧视口到新视口,然后getBBox 在新视口中只报告完全相同的像素尺寸; (2) 如果你明确地创建一个大小为“100px”的新对象,它实际上被绘制为 100mm。然而,这一切似乎都是一个有争议的问题——见我上面的编辑。
  • 浏览器假定像素到 mm 的固定转换为 25.4 / 96.0 如果要转换单位,则可以使用该转换因子指定 viewBox。
  • @RobertLongson 请帮助解决这个问题stackoverflow.com/questions/15452397/…
猜你喜欢
  • 2021-08-29
  • 2016-07-28
  • 1970-01-01
  • 2013-01-15
  • 1970-01-01
  • 1970-01-01
  • 2018-01-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多