如何在R中显示base64图像

3

我想在R中显示一个base64图片。假设我已经有一个包含代码的变量,例如:

image<-"agQDL64bK8x2..."

有没有类似于的软件包或命令

plot(image)

如何显示相应的图像?

以下是完整说明。我从外部输入获取字符串base64变量。 base64代码如下:

x<-"/9j/4AAQSkZJRgABAQEASABIAAD/2wBDAAIBAQIBAQICAgICAgICAwUDAwMDAwYEBAMFBwYHBwcGBwcICQsJCAgKCAcHCg0KCgsMDAwMBwkODw0MDgsMDAz/wAALCAAgACABAREA/8QAGAABAQEBAQAAAAAAAAAAAAAABQYDBAH/xAAjEAABBQEAAgMBAQEBAAAAAAACAQMEBQYHCBIRExQhACJB/9oACAEBAAA/ABMfwnJcK0WrucdoMdrtpQ3IQOm+VPVq49RGh6AvT2qcjUGhrY2jZChASC4X/BtkSo4yiadt3/R6/esuXXbvKuv0QwGJ05nWeR+b5bOeJ1FNHQysaHPkQWFD1JBmI2oi4Psif34e028heSoUhdBl3/VW2oci1zlq45SMdUzIVrLDkmfk9bQOHWaNYJG+8/AL6pifSBqyXqgrJdA65t+L9tY8go8+DovILx6q6zR6PQ0kT8MHyP5RYE2w1dfQKKJSo4E2y+RCotfDa/YZxWxbodE9FpbsmMTH0+Z5/wAqc0HOuXu5+PFWwoM9QJHZ0uir3iJWiv763mQ6uHLFv3bOa44vyY+y8kORouc1TtDB04U8CsfVJldkpUhioZdE1Rx1pv7BGSRKKiE2ar8+Y36yJEpP0JDhetY6Vodva2RvpX3E52JMeuiMnJVbbtSBZp57xOL9rr8KW/ElsOPKTwshIj/P45rrH+W4llarZ9s5dBbWozWH3cno+YkU0WHHYars1o+f1m0Ko9mhAVjQbCylI2Px8ChfH8+P8BxDMWuL4hyqIyFnf7nBxehZqRQR40mUsvSZroVXtXKhFbE1GXNra6UjSKnsZNin9/n+2TNP5Dn0+wSQzos3GajPPzHHxZh2FO6CBUWThGiMsMS4wMSo7j6g197kiJ7frhOsKJn7HPdmsnIUXQJfrKivJLqchOiTbFpgvkHXh+HCWIIoXqk+w/PXw1UJLkgijpCmM3s6drqD8GMh5vRdF7HH0HPeZrRQZCQr650LjA6nTwzNRfaoaeqhRKqFJ9V924JuKKB7KND0HqWP7RxVvyFYmz894/8AkHY1mh1N/n4yzp3jd1mvRtlq7/MPwYxZB+jb5KKG8htl9gJIZF2W0e2meOEOjf6HLzvLSGRJtMtcoN1Ycl0L1jIjm/Pyeqz7rdpmlnCEl1+CiuQyR1DJkPYQFvtO85kOEhrb9s8V5OXWeFnYhrPITWdgYjl6GSSGcuEaHHlviZeyDNF5PYU9kX/3pz3jzre35faaDP3OxwXP9PVJD6t5SdcghnLK5pPltFqMtTl6pXVTwkKt/AgJIf1KSKy0B//Z"

我想展示这张图片,可能是在一个图中。
非常感谢您的帮助。

相关帖子但没有答案:https://stackoverflow.com/questions/39855039/r-plot-base64-string - zx8754
1
也与此相关:https://dev59.com/X1wX5IYBdhLWcg3wwx1S - lukeA
1个回答

7
假设你有一个带透明度的PNG图片,其中txt是文件名:
library(RCurl)
getImg <- function(txt) {
  raw <- base64Decode(txt, mode="raw")
  if (all(as.raw(c(0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a))==raw[1:8])) { # it's a png...
    img <- png::readPNG(raw)
    transparent <- img[,,4] == 0
    img <- as.raster(img[,,1:3])
    img[transparent] <- NA
  } else if (all(as.raw(c(0xff, 0xd8, 0xff, 0xd9))==raw[c(1:2, length(raw)-(1:0))])) { # it's a jpeg...
    img <- jpeg::readJPEG(raw)
  } else stop("No Image!")
  return(img)
}
par(mfrow = c(1,2))
fn <- system.file("img", "Rlogo.png", package="png")
txt <- base64Encode(readBin(fn, "raw", file.info(fn)[1, "size"]), "txt")
plot(1:2, type='n')
rasterImage(getImg(txt), 1.2, 1.27, 1.8, 1.73, interpolate=FALSE)
txt <- "/9j/4AAQSkZJRgABAQEASABIAAD/2wBDAAIBAQIBAQICAgICAgICAwUDAwMDAwYEBAMFBwYHBwcGBwcICQsJCAgKCAcHCg0KCgsMDAwMBwkODw0MDgsMDAz/wAALCAAgACABAREA/8QAGAABAQEBAQAAAAAAAAAAAAAABQYDBAH/xAAjEAABBQEAAgMBAQEBAAAAAAACAQMEBQYHCBIRExQhACJB/9oACAEBAAA/ABMfwnJcK0WrucdoMdrtpQ3IQOm+VPVq49RGh6AvT2qcjUGhrY2jZChASC4X/BtkSo4yiadt3/R6/esuXXbvKuv0QwGJ05nWeR+b5bOeJ1FNHQysaHPkQWFD1JBmI2oi4Psif34e028heSoUhdBl3/VW2oci1zlq45SMdUzIVrLDkmfk9bQOHWaNYJG+8/AL6pifSBqyXqgrJdA65t+L9tY8go8+DovILx6q6zR6PQ0kT8MHyP5RYE2w1dfQKKJSo4E2y+RCotfDa/YZxWxbodE9FpbsmMTH0+Z5/wAqc0HOuXu5+PFWwoM9QJHZ0uir3iJWiv763mQ6uHLFv3bOa44vyY+y8kORouc1TtDB04U8CsfVJldkpUhioZdE1Rx1pv7BGSRKKiE2ar8+Y36yJEpP0JDhetY6Vodva2RvpX3E52JMeuiMnJVbbtSBZp57xOL9rr8KW/ElsOPKTwshIj/P45rrH+W4llarZ9s5dBbWozWH3cno+YkU0WHHYars1o+f1m0Ko9mhAVjQbCylI2Px8ChfH8+P8BxDMWuL4hyqIyFnf7nBxehZqRQR40mUsvSZroVXtXKhFbE1GXNra6UjSKnsZNin9/n+2TNP5Dn0+wSQzos3GajPPzHHxZh2FO6CBUWThGiMsMS4wMSo7j6g197kiJ7frhOsKJn7HPdmsnIUXQJfrKivJLqchOiTbFpgvkHXh+HCWIIoXqk+w/PXw1UJLkgijpCmM3s6drqD8GMh5vRdF7HH0HPeZrRQZCQr650LjA6nTwzNRfaoaeqhRKqFJ9V924JuKKB7KND0HqWP7RxVvyFYmz894/8AkHY1mh1N/n4yzp3jd1mvRtlq7/MPwYxZB+jb5KKG8htl9gJIZF2W0e2meOEOjf6HLzvLSGRJtMtcoN1Ycl0L1jIjm/Pyeqz7rdpmlnCEl1+CiuQyR1DJkPYQFvtO85kOEhrb9s8V5OXWeFnYhrPITWdgYjl6GSSGcuEaHHlviZeyDNF5PYU9kX/3pz3jzre35faaDP3OxwXP9PVJD6t5SdcghnLK5pPltFqMtTl6pXVTwkKt/AgJIf1KSKy0B//Z"
plot(1:2, type='n')
rasterImage(getImg(txt), 1.2, 1.27, 1.8, 1.73, interpolate=FALSE)

正要发布类似的内容,也基于RCurl::base64。不认为将透明度设置为NA总是必要的:我可以在readPNG之后很快绘制标志(尽管可能与设备有关)。 - nicola
非常感谢,它运行良好。只有一件事。在您的示例中,您通过函数base64Encode获取base64代码。如果我的base64代码来自外部源并保存在chr变量中,该怎么办? - Marco De Virgilis
@nicola 是的,这可能是真的——我刚从?png::readPNG的示例部分中获取了绘图代码。 - lukeA
是的,问题在于当我尝试应用readPNG命令时,我收到了错误信息Error in readPNG(raw) : libpng error: Not a PNG file。 我无法在此粘贴我的base64字符串,因为它太长了。 - Marco De Virgilis
1
@MarcoDeVirgilis 你得到了一个jpeg,而不是png。使用 img <- jpeg::readJPEG(raw);plot(1:2, type='n');rasterImage(img, 1.2, 1.27, 1.8, 1.73) - lukeA
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接