【问题标题】:Method in R to crop whitespace on svg fileR中的方法在svg文件上裁剪空白
【发布时间】: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")

产生:

【问题讨论】:

    标签: r svg imagemagick knitr


    【解决方案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 的输出,您应该只会收到该错误。我已重命名变量以使其更清晰。你能用新版本再试一次吗?
    • 抱歉耽搁了。这按预期工作!感谢您使变量更加清晰。
    猜你喜欢
    • 2016-07-17
    • 2014-06-26
    • 1970-01-01
    • 2011-11-15
    • 2018-05-15
    • 2020-01-12
    • 2016-10-01
    • 1970-01-01
    相关资源
    最近更新 更多