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

时间:2017-10-17 20:50:56

标签: r ggplot2 png

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

我在记忆中的图像是例如

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

更新一个真实的用例,以及我在尝试使用答案#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)))

3 个答案:

答案 0 :(得分:3)

这可能有效:

  • 从矢量中读取图像
  • 渲染图像
  • 使用空白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)

答案 1 :(得分:1)

我找不到任何方法从内存中加载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) 

答案 2 :(得分:1)

基于@SkyWalker,它对我有用。

库(ggplot2)

library(raster)
library(qrencoder)
library(grid)



setwd("D:/WORK/R_Prj/OCR")
QRtxt <- paste0("Qt",round(runif(10)*10))

QR.in.Batch <- function(x){
qrGrob <- grid::rasterGrob(raster::as.raster(
  qrencoder::qrencode_raster(x), 
  maxpixels=.Machine$integer.max,col=c("white", "black")),
  interpolate=FALSE)    
ggplot() + geom_blank() + annotation_custom(qrGrob,0,1,0,1) 
}

lapply(QRtxt, QR.in.Batch)