3

I am trying to show a base64 image in R. Let's assume I have got a variable which contains the code, eg.

image<-"agQDL64bK8x2..."

Is there a package or a command similar to

plot(image)

to show the corresponding image?

Here the full explanation. I get the string base64 variable from external input. The base64 code is as follows:

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"

I just would like to display this image, possibly in a plot.

Thank you very much for your help

Marco De Virgilis
  • 982
  • 1
  • 9
  • 29
  • Related post but with no answer: https://stackoverflow.com/questions/39855039/r-plot-base64-string – zx8754 Sep 04 '17 at 08:27
  • 1
    Also somehow related: https://stackoverflow.com/questions/33409363/convert-r-image-to-base-64 – lukeA Sep 04 '17 at 08:38

1 Answers1

7

Assuming you got a PNG with transparency in 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)
lukeA
  • 53,097
  • 5
  • 97
  • 100
  • Was about to post something similar also based on `RCurl::base64`. Don't think it's always necessary to set transparency to `NA`: I can plot the logo soon after `readPNG` (guess it might be device dependent though). – nicola Sep 04 '17 at 08:45
  • Thank you very much, it works fine. Just one thing. In your example, you get the base64 code through the function `base64Encode`. What if, instead, my base64 code comes from an external source and it is saved in a chr variable? – Marco De Virgilis Sep 04 '17 at 08:45
  • @nicola Yep that might be true - I just grabbed the plotting code from `?png::readPNG`'s example section. – lukeA Sep 04 '17 at 09:16
  • Yes, the problem is when I tried to apply the command `readPNG`, the I get the error `Error in readPNG(raw) : libpng error: Not a PNG file`. I can't paste here my base64 string because is too long – Marco De Virgilis Sep 04 '17 at 09:22
  • @MarcoDeVirgilis Hmm please edit your post then and make it a reproducinble example to remove guess work (i.e. by providing the image if possible, or another dummy image). Maybe you can use https://pastebin.com/ to provide the character string or sth? – lukeA Sep 04 '17 at 09:24
  • 1
    @MarcoDeVirgilis You got a jpeg, not a png. Use `img <- jpeg::readJPEG(raw);plot(1:2, type='n');rasterImage(img, 1.2, 1.27, 1.8, 1.73)`. – lukeA Sep 04 '17 at 10:06
  • It works, thank you very much. I only have a question, how do I know if the base64 code indicates a jpeg or a png? – Marco De Virgilis Sep 04 '17 at 14:54
  • @MarcoDeVirgilis https://stackoverflow.com/questions/27670077/how-can-i-tell-if-an-extensionless-image-is-png-or-jpeg - check the binary for the magic bytes. – lukeA Sep 04 '17 at 14:57
  • This is a great answer. I feel like the function should be formalised and exist somewhere more accessible (i.e. an R library, although I don't know which one). – stevec Feb 23 '20 at 09:19