R中的方法在svg文件上裁剪空白

Posted

技术标签:

【中文标题】R中的方法在svg文件上裁剪空白【英文标题】:Method in R to crop whitespace on svg file 【发布时间】:2021-12-15 05:52:54 【问题描述】:

尝试裁剪 SVG 周围的空白(在本例中为“透明空间”)。并没有真正看到一个简单的方法来做到这一点。尝试了 knitr::plot_crop() 和 magick::image_trim() 但无济于事。这两种方法的输出都会移除 alpha 层并使其具有白色背景。

以下示例 SVG:https://freesvg.org/crossed-onions 并点击“下载”

原文:

针织法:

knitr::plot_crop("~/Downloads/onions-pd.svg")

产生:

Imagemagick 版本:

library(magick)
img = image_read("~/Downloads/onions-pd.svg")
img = image_trim(img)
image_write(img,"~/Downloads/onions-pd.svg",format="svg")

产生:

【问题讨论】:

【参考方案1】:

听起来您想裁剪 svg 的 viewBox。可能有很多方法可以做到这一点,但一种是计算出新的 viewBox 坐标并将它们写入 svg 文件。

我们可以像这样得到不透明部分的限制:

library(magick)

img <- image_read_svg("onions-pd.svg")
data   <- image_data(img) 
opaque <- which(data[4,,] != 0, arr.ind = TRUE)
limits <- paste(paste(apply(opaque, 2, min), collapse = ", "), 
                paste(apply(opaque, 2, max), collapse = ", "), sep = ", ")

limits
#> [1] "11, 64, 417, 440"

并将它们写入 svg 文件的副本,如下所示:

library(xml2)

onions_xml <- read_xml("onions-pd.svg")

xml_set_attr(onions_xml, attr = "viewBox", limits)

write_xml(onions_xml, "onions-cropped.svg")

【讨论】:

谢谢!我确实收到以下错误:Error in `[.magick-image`(img, 4, , ) : unused arguments (alist(, )) @engineerchange 如果您尝试对图像进行子集化,而不是image_data 的输出,您应该只会收到该错误。我已重命名变量以使其更清晰。你能用新版本再试一次吗? 抱歉耽搁了。这按预期工作!感谢您使变量更加清晰。

以上是关于R中的方法在svg文件上裁剪空白的主要内容,如果未能解决你的问题,请参考以下文章

裁剪 SVG 的正确方法?

9. svg学习笔记-裁剪和蒙版

如何在 HTML/CSS 中裁剪 SVG 文件

从图像中裁剪空白

PHP Imagick 中的裁剪错误?

Python批量裁剪图形外围空白区域