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
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 successfully decode Data Matrix barcodes that are base256 encoded using pylibdmtx. When the barcode contains a 0x00 byte the library seems to treat it as a string terminator (null) and ignores the rest of the data in the barcode.
Here is a snippet of code that will create a barcode and decode it:
from pylibdmtx.pylibdmtx import encode, decode
from PIL import Image
message = b'\x16\x05abc\x64\x00\x65\x66g'
print('message:',message)
barcode = encode(message)
img = Image.frombytes('RGB', (barcode.width, barcode.height), barcode.pixels)
# uncomment if you want to save the barcode to a file
#img.save('barcode.png')
decoded = decode(img)
print('decoded:',decoded)
print(' length:',len(decoded[0].data))
Here is the result:
message: b'\x16\x05abcd\x00efg'
decoded: [Decoded(data=b'\x16\x05abcd', rect=Rect(left=9, top=10, width=80, height=79))]
length: 6
The created barcode reads properly with other online tools and dmtxread invoked from a command line.
Is there a limitation with the python wrappers for libdmtx or something I am doing wrong?
Other Info:
This is the simplest example I could come up with to illustrate the problem. The barcodes are much larger and already in production systems.
I did try the python wrappers for the ZXing library and it did not even recognize many of the barcodes. I am open to using other libraries.
Thank you.
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)
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()