如何将内存中的png图像添加到图中?

问题描述:

我有一个在内存中自动生成的PNG图像,而不是从磁盘加载它。我当然可以先将它保存到磁盘上,但我宁愿不这样做。我想在ggplot2图的某处显示该图像,但无法找到正确的包或函数来执行此操作。如何将内存中的png图像添加到图中?

我在记忆中的图像是例如

x <- "data:image/png;base64,..." 

UPDATE一个现实的用例,和我试图使用回答#1

library(qrencoder) 
x <- qrencode_png("http://rud.is/b") 
x 
[1] "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABUAAAAVCAAAAACMfPpKAAAACXBIWXMAAC4jAAAuIwF4pT92AAAAfElEQVQYlU2QWwrEMAwDR0vuf+XZj8qJSyjIyNYjAkAMQNFhkBCKzoNiin70kxKBN41ENuf7+9AZWQOGRx/2m4TeKy2YO0GyDpwszW5EUCs/ur78NZtGvSa8azdPDGttsonot8LtDFNnrs4yLSbuJk0ajnV3vevhCxUj4Q+R11n764g4WgAAAABJRU5ErkJggg==" 
myImage <- png::readPNG(x) 
    > Error in png::readPNG(x) : 
    > unable to open  
    > data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABUAAAAVCAAAAACMfPpKAAAACXBIWXMAAC4jAAAuIwF4pT92AAAAfElEQVQYlU2QWwrEMAwDR0vuf+XZj8qJSyjIyNYjAkAMQNFhkBCKzoNiin70kxKBN41ENuf7+9AZWQOGRx/2m4TeKy2YO0GyDpwszW5EUCs/ur78NZtGvSa8azdPDGttsonot8LtDFNnrs4yLSbuJk0ajnV3vevhCxUj4Q+R11n764g4WgAAAABJRU5ErkJggg== 

我也曾尝试错误的下面,但我得到不同的错误:

qrGrob <- grid::gTree(children=gList(grid::rasterGrob(x))) 

qrGrob <- grid::gTree(children=gList(grid::rasterGrob(x))) 
+0

看看'magick'包。它现在有一个设备,你可以渲染ggplot对象,然后在其上构建内存中的png图像。 – hrbrmstr

+0

@hrbrmstr感谢您的评论。我检查了'magick'包,但是我发现没有明显的方式来覆盖我的OP使用案例。这里有很多函数以图像作为参数,但只有一个已经使用自己的API读取。 –

我可以没有找到任何方法从内存中加载PNG。然而,这种方式完美地使用光栅版本:

library(ggplot2) 
library(raster) 
library(qrencoder) 
library(grid) 
qrGrob <- grid::rasterGrob(raster::as.raster(
       qrencoder::qrencode_raster("http://rud.is/b"), 
       maxpixels=.Machine$integer.max,col=c("white", "black")), 
       interpolate=FALSE)  
ggplot() + geom_blank() + annotation_custom(qrGrob,0,1,0,1) 

这可能会实现:

  • 从矢量
  • 读取图像使用空白ggplot2 GEOM渲染图像
  • 情节

代码:

myImage <- png::readPNG(x) 
myImage <- grid::rasterGrob(myImage, interpolate = TRUE) 
library(ggplot2) 
ggplot() + 
    geom_blank() + 
    annotation_custom(myImage, xmin = -Inf, xmax = Inf, ymin = -Inf, ymax = Inf) 
+0

谢谢!但不幸的是,我收到了更新中显示的错误:'无法打开data:image/png; base64' –