代码之家  ›  专栏  ›  技术社区  ›  SkyWalker

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

  •  1
  • SkyWalker  · 技术社区  · 7 年前

    我有一个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<-网格::gTree(children=gList(网格::rasterGrob(x)))
    
    3 回复  |  直到 7 年前
        1
  •  4
  •   pogibas    7 年前

    这可能会起作用:

    • 从矢量中读取图像
    • 渲染图像
    • 使用空白打印 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)
    
        2
  •  1
  •   SkyWalker    7 年前

    我找不到任何方法从内存中加载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) 
    
        3
  •  1
  •   Grec001    6 年前

    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)