https://pastebin.com/czxkGQp1
Here is a link to the ipynb source code. I'm wondering what format these images are saved as. I'm referring to the long string of characters here:
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAXcAAAD4CAYAAAAXUaZHAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjMsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+AADFEAAAgAElEQVR4nO3deXhU9dn/8ffNvu9hJ+z7IktY3PeKWwGlrTy1arWiffTp8tiyKFZcqmhdautWrKj0sWhLEFFww31Fg0oS9rAHQsKesCRkuX9/zNBfxCCBmWEyM5/XdeXKnO+cmXMfTvhw+ObMfczdERGR+FIt2gWIiEj4KdxFROKQwl1EJA4p3EVE4pDCXUQkDtWIdgEALVq08E6dOkW7DBGRmLJ48eLt7p5U0XNVItw7depEWlpatMsQEYkpZrbhSM9pWkZEJA4p3EVE4pDCXUQkDincRUTikMJdRCQOHTXczayDmb1nZsvNbKmZ/To43szM3jaz1cHvTYPjZmZ/MbMsM0s3s
And on and on and on. I'm trying to find a way to load this ipynb in to a Python script and save these images to my local machine using pillow or some other library.
Any help would be greatly appreciated.
That encoding is known as base64, and can be manipulated using Python's base64 module in the standard library. The 64 comes from all lowercase ASCII letters (26), the uppercase letters (26), the digits 0-9 (10), and the characters + and /. The = characters at the end are used for padding out the encoded bytes so the decoding algorithm works.
You can take your string and decode the base64 in a Jupyter notebook and display it with something like:
%matplotlib inline
import base64
import io
from PIL import Image
s = "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"
image = base64.b64decode(s)
img = Image.open(io.BytesIO(image))
img
Of course, you can just save the bytes to disk too if want the the file:
image = base64.b64decode(s)
with open (path, 'wb') as file:
file.write(image)
Related
I've tried this a number of ways and have searched high and low, but no matter what I try (including all posts I could find here on the subject) I can't manage to convert my base64 string of an HTML document / canvas containing JavaScript.
I'm not getting the incorrect padding error which is quite common (I have ensured 'data:text/html;base64,' is not included at the start of the base64 string.)
I have also checked the base64 string both by checking and running the original .html file, which renders in browser with no issue, and decoding the string with an online decoder.
I know I must be missing something very simple here, but after several hours I'm ready to pull my hair out.
My encoding step is as follows:
htmlSource = bytes(htmlSource,'UTF-8')
fullBase64 = base64.b64encode(htmlSource)
The resultant base64 string is included in my attempts below, which should generate a turquoise oval with shadow on a dirty white background in 4k.
The following attempts all create a png file, only 1kb in size, which cannot be opened - 'It may be damaged or use a file format that Preview doesn’t recognise.':
import base64
img_data = b'PCFET0NUWVBFIGh0bWw+CjxodG1sPgogIDxoZWFkPgogICAgPG1ldGEgbmFtZT0ndmlld3BvcnQnIGNvbnRlbnQ9J3dpZHRoPWRldmljZS13aWR0aCwgaW5pdGlhbC1zY2FsZT0xLjAnPgogIDwvaGVhZD4KPGJvZHk+CjxzdHlsZT4KICAgIGJvZHksIGh0bWwgewogICAgICBwYWRkaW5nOiAwICFpbXBvcnRhbnQ7CiAgICAgIG1hcmdpbjogMCAhaW1wb3J0YW50OwogICAgICBtYXJnaW46IDA7CiAgICB9CiAgICAqIHsKICAgICAgcGFkZGluZzogMDsKICAgICAgbWFyZ2luOiAwOwogICAgfQo8L3N0eWxlPgoKPGNhbnZhcyBpZD0nbXlDYW52YXMnIHN0eWxlPSdvYmplY3QtZml0OiBjb250YWluOyB3aWR0aDogOTl2dzsgaGVpZ2h0OiA5OXZoOyc+CllvdXIgYnJvd3NlciBkb2VzIG5vdCBzdXBwb3J0IHRoZSBIVE1MNSBjYW52YXMgdGFnLjwvY2FudmFzPgoKPHNjcmlwdD4KdmFyIGNhbnZhcyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdteUNhbnZhcycpOwpjYW52YXMud2lkdGggPSA0MDk2OwpjYW52YXMuaGVpZ2h0ID0gNDA5NjsKY2FudmFzLnN0eWxlLndpZHRoID0gJzk5dncnOwpjYW52YXMuc3R5bGUuaGVpZ2h0ID0gJzk5dmgnOwp2YXIgY3R4ID0gY2FudmFzLmdldENvbnRleHQoJzJkJyk7CnZhciBjYW52YXNXID0gY3R4LmNhbnZhcy53aWR0aDsKdmFyIGNhbnZhc0ggPSBjdHguY2FudmFzLmhlaWdodDsKCmN0eC5maWxsU3R5bGUgPSAncmdiYSgyMDAsIDE5NywgMTc3LCAxKSc7CmN0eC5maWxsUmVjdCgwLCAwLCBjYW52YXNXLCBjYW52YXNIKTsKCmN0eC5zaGFkb3dCbHVyID0gY2FudmFzVzsKY3R4LnNoYWRvd0NvbG9yID0gJ3JnYmEoMCwgMCwgMCwgMC4zKSc7CmN0eC5iZWdpblBhdGgoKTsKY3R4LmZpbGxTdHlsZSA9ICdyZ2JhKDUxLCAyMjAsIDE5MSwgMSknOwpjdHguZWxsaXBzZShjYW52YXNXIC8gMiwgY2FudmFzSCAvIDIgLCBjYW52YXNXICogLjQsIGNhbnZhc0ggKiAuNDUsIDAsIDAsIDIgKiBNYXRoLlBJKTsKY3R4LmZpbGwoKTsKCgoKPC9zY3JpcHQ+Cgo8L2JvZHk+CjwvaHRtbD4='
with open("turquoise egg.png", "wb") as fh:
fh.write(base64.decodebytes(img_data))
Version 2
from binascii import a2b_base64
data = 'PCFET0NUWVBFIGh0bWw+CjxodG1sPgogIDxoZWFkPgogICAgPG1ldGEgbmFtZT0ndmlld3BvcnQnIGNvbnRlbnQ9J3dpZHRoPWRldmljZS13aWR0aCwgaW5pdGlhbC1zY2FsZT0xLjAnPgogIDwvaGVhZD4KPGJvZHk+CjxzdHlsZT4KICAgIGJvZHksIGh0bWwgewogICAgICBwYWRkaW5nOiAwICFpbXBvcnRhbnQ7CiAgICAgIG1hcmdpbjogMCAhaW1wb3J0YW50OwogICAgICBtYXJnaW46IDA7CiAgICB9CiAgICAqIHsKICAgICAgcGFkZGluZzogMDsKICAgICAgbWFyZ2luOiAwOwogICAgfQo8L3N0eWxlPgoKPGNhbnZhcyBpZD0nbXlDYW52YXMnIHN0eWxlPSdvYmplY3QtZml0OiBjb250YWluOyB3aWR0aDogOTl2dzsgaGVpZ2h0OiA5OXZoOyc+CllvdXIgYnJvd3NlciBkb2VzIG5vdCBzdXBwb3J0IHRoZSBIVE1MNSBjYW52YXMgdGFnLjwvY2FudmFzPgoKPHNjcmlwdD4KdmFyIGNhbnZhcyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdteUNhbnZhcycpOwpjYW52YXMud2lkdGggPSA0MDk2OwpjYW52YXMuaGVpZ2h0ID0gNDA5NjsKY2FudmFzLnN0eWxlLndpZHRoID0gJzk5dncnOwpjYW52YXMuc3R5bGUuaGVpZ2h0ID0gJzk5dmgnOwp2YXIgY3R4ID0gY2FudmFzLmdldENvbnRleHQoJzJkJyk7CnZhciBjYW52YXNXID0gY3R4LmNhbnZhcy53aWR0aDsKdmFyIGNhbnZhc0ggPSBjdHguY2FudmFzLmhlaWdodDsKCmN0eC5maWxsU3R5bGUgPSAncmdiYSgyMDAsIDE5NywgMTc3LCAxKSc7CmN0eC5maWxsUmVjdCgwLCAwLCBjYW52YXNXLCBjYW52YXNIKTsKCmN0eC5zaGFkb3dCbHVyID0gY2FudmFzVzsKY3R4LnNoYWRvd0NvbG9yID0gJ3JnYmEoMCwgMCwgMCwgMC4zKSc7CmN0eC5iZWdpblBhdGgoKTsKY3R4LmZpbGxTdHlsZSA9ICdyZ2JhKDUxLCAyMjAsIDE5MSwgMSknOwpjdHguZWxsaXBzZShjYW52YXNXIC8gMiwgY2FudmFzSCAvIDIgLCBjYW52YXNXICogLjQsIGNhbnZhc0ggKiAuNDUsIDAsIDAsIDIgKiBNYXRoLlBJKTsKY3R4LmZpbGwoKTsKCgoKPC9zY3JpcHQ+Cgo8L2JvZHk+CjwvaHRtbD4='
binary_data = a2b_base64(data)
fd = open('turquoise egg.png', 'wb')
fd.write(binary_data)
fd.close()
Version 3
import base64
fileString = 'PCFET0NUWVBFIGh0bWw+CjxodG1sPgogIDxoZWFkPgogICAgPG1ldGEgbmFtZT0ndmlld3BvcnQnIGNvbnRlbnQ9J3dpZHRoPWRldmljZS13aWR0aCwgaW5pdGlhbC1zY2FsZT0xLjAnPgogIDwvaGVhZD4KPGJvZHk+CjxzdHlsZT4KICAgIGJvZHksIGh0bWwgewogICAgICBwYWRkaW5nOiAwICFpbXBvcnRhbnQ7CiAgICAgIG1hcmdpbjogMCAhaW1wb3J0YW50OwogICAgICBtYXJnaW46IDA7CiAgICB9CiAgICAqIHsKICAgICAgcGFkZGluZzogMDsKICAgICAgbWFyZ2luOiAwOwogICAgfQo8L3N0eWxlPgoKPGNhbnZhcyBpZD0nbXlDYW52YXMnIHN0eWxlPSdvYmplY3QtZml0OiBjb250YWluOyB3aWR0aDogOTl2dzsgaGVpZ2h0OiA5OXZoOyc+CllvdXIgYnJvd3NlciBkb2VzIG5vdCBzdXBwb3J0IHRoZSBIVE1MNSBjYW52YXMgdGFnLjwvY2FudmFzPgoKPHNjcmlwdD4KdmFyIGNhbnZhcyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdteUNhbnZhcycpOwpjYW52YXMud2lkdGggPSA0MDk2OwpjYW52YXMuaGVpZ2h0ID0gNDA5NjsKY2FudmFzLnN0eWxlLndpZHRoID0gJzk5dncnOwpjYW52YXMuc3R5bGUuaGVpZ2h0ID0gJzk5dmgnOwp2YXIgY3R4ID0gY2FudmFzLmdldENvbnRleHQoJzJkJyk7CnZhciBjYW52YXNXID0gY3R4LmNhbnZhcy53aWR0aDsKdmFyIGNhbnZhc0ggPSBjdHguY2FudmFzLmhlaWdodDsKCmN0eC5maWxsU3R5bGUgPSAncmdiYSgyMDAsIDE5NywgMTc3LCAxKSc7CmN0eC5maWxsUmVjdCgwLCAwLCBjYW52YXNXLCBjYW52YXNIKTsKCmN0eC5zaGFkb3dCbHVyID0gY2FudmFzVzsKY3R4LnNoYWRvd0NvbG9yID0gJ3JnYmEoMCwgMCwgMCwgMC4zKSc7CmN0eC5iZWdpblBhdGgoKTsKY3R4LmZpbGxTdHlsZSA9ICdyZ2JhKDUxLCAyMjAsIDE5MSwgMSknOwpjdHguZWxsaXBzZShjYW52YXNXIC8gMiwgY2FudmFzSCAvIDIgLCBjYW52YXNXICogLjQsIGNhbnZhc0ggKiAuNDUsIDAsIDAsIDIgKiBNYXRoLlBJKTsKY3R4LmZpbGwoKTsKCgoKPC9zY3JpcHQ+Cgo8L2JvZHk+CjwvaHRtbD4='
decodeit = open('turquoise egg.png', 'wb')
decodeit.write(base64.b64decode((fileString)))
decodeit.close()
FWIW I originally used the following code to create a png from the HTML without using base64, but it would only ever save the first element of JavaScript generated on the canvas (ie the background) and since I require the information in base64 anyway, thought I would approach it this way in order to capture the complete image
file = open('html.html', 'r')
imgkit.from_file(file, 'png.png')
file.close()
Html2Image has provided the solution I was looking for.
Whilst imgkt wasn't saving the fully rendered canvas, taking screenshot with html2canvas does. Documentation is here and I implemented as follows:
from html2image import Html2Image
hti.screenshot(
html_file = ‘html.html’,
size = (imageW, imageH),
save_as = ‘png.png'
)
I'm trying to send json dict that should contain Pillow image as one of his fields, to do that I have to convert the image to string.
I tried to use pillow function:
image.toString()
but still got it as bytes, so I tried to encode it:
buff = BytesIO()
image.save(buff, format="JPEG")
img_str = base64.b64encode(buff.getvalue())
but still got it as bytes.
How can I convert Pillow images to format that can be saved in json file?
In the comments, Mark Setchell suggests calling .decode('ascii') on the result of your b64encode call. I agree that this will work, but I think base64encoding to begin with is introducing an unnecessary extra step that complicates your code.*
Instead, I suggest directly decoding the bytes returned by image.tostring. The only complication is that the bytes object can contain values larger than 128, so you can't decode it with ascii. Try using an encoding that can handle values up to 256, such as latin1.
from PIL import Image
import json
#create sample file. You don't have to do this in your real code.
img = Image.new("RGB", (10,10), "red")
#decode.
s = img.tobytes().decode("latin1")
#serialize.
with open("outputfile.json", "w") as file:
json.dump(s, file)
(*but, to my surprise, the resulting json file is still smaller than one made with a latin1 encoding, at least for my sample file. Use your own judgement to determine whether file size or program clarity is more important.)
I use the following to exchange Pillow images via json.
import json
from PIL import Image
import numpy as np
filename = "filename.jpeg"
image = Image.open(filename)
json_data = json.dumps(np.array(image).tolist())
new_image = Image.fromarray(np.array(json.loads(json_data), dtype='uint8'))
1) I have an image that I converted to a string. It looks like this:
bytesimage = b'iVBORw0KGgoAAAANSUhEUgA.... etc etc
2) I can convert it to an 'bytesimage.png' using:
def StringToImage(self, stringname, imageoutput):
imgdata = base64.b64decode(stringname)
imagename = imageoutput
with open(imagename, 'wb') as f:
f.write(imgdata)
3) But then I want to save that image or string to memory to use in wxpython interface without needing to save the file. I have seen several related questions where the solution is using io.BytesIO, but I just cant connect the steps and both wxpython or PIL don't seem to read the bytes properly.
So to clarify:
I have a image stored in a string DONE
I can convert that to an image (if needed) but dont want to save it DONE
I need that string OR image (whichever is best) saved to memory NEEDS SOLVING
Then I want to be able to use that image in wxpython (I can open in PIL first if required)
Any help would be fantastic!
StringIO seems to be the way to go. It allows you to pass the decoded string directly to PIL.
import base64
from PIL import Image
import StringIO
# Banana emoji (JPG) as a b64 string.
b64_img_str = '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'
# Decode back to the original bytes
new_img_str = base64.b64decode(b64_img_str)
# Use StringIO to provide an in-memory buffer that we can use
# to pass the image string to PIL.
sio = StringIO.StringIO(new_img_str)
img = Image.open(sio)
# Display the image
img.show()
I have searched in a lot of different places but could not find the answer to this.
It seems like the suggested way of guessing the extension of base64 encoded string (The string does not have an extension in it and its a valid image) is to use PIL package. This is what I am currently doing.
But when I attempt to open the image I get the error cannot identify image file.
Any suggestions on what I might be doing wrong ?
#img_content is base64 encoded string
decodedbytes = base64.decodebytes(str.encode(image_content))
image_stream = StringIO(str(decodedbytes))
image = Image.open(image_stream) #<-----ERROR
filetype = image.format
In my rtf document, I want to extract image from string:
The string is like this:
\pard\pard\qc{\*\shppict{\pict\pngblip\picw320\pich192\picwgoal0\pichgoal0
89504e470d0a1a0a0000000d4948445200000140000000c00802000000fa352d9100000e2949444[.....]6c4f0000000049454e44ae426082
}}
questions:
1) is this really base64?
2) How to decode it using below code.?
import base64
imgData = b"base64code00from007aove007string00bcox007idont007know007where007it007starts007and007ends"
with open("imageToSave.png", "wb") as fh:
fh.write(base64.decodestring(imgData))
Full rtf text(which when saved as .rtf shows image) is at:
http://hastebin.com/axabazaroc.tex
No, that's not Base64-encoded data. It is hexadecimal. From the Wikipedia article on the RTF format:
RTF supports inclusion of JPEG, Portable Network Graphics (PNG), Enhanced Metafile (EMF), Windows Metafile (WMF), Apple PICT, Windows Device-dependent bitmap, Windows Device Independent bitmap and OS/2 Metafile picture types in hexadecimal (the default) or binary format in a RTF file.
The binascii.unhexlify() function will decode that back to binary image data for you; you have a PNG image here:
>>> # data contains the hex data from your link, newlines removed
...
>>> from binascii import unhexlify
>>> r = unhexlify(data)
>>> r[:20]
'\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x01#'
>>> from imghdr import test_png
>>> test_png(r, None)
'png'
but of course the \pngblip entry was a clue there. I won't include the image here, it is a rather dull 8-bit 320x192 black rectangle.