Load an html5 canvas into a PIL Image with Django
HTML:
<form action="" method="post">
{% csrf_token %}
<input type="hidden" name="width" value="">
<input type="hidden" name="height" value="">
<input type="hidden" name="image_data" value="">
</form>
Javascript:
function submit_pixels(canvas) {
$('form input[name=image_data]').val(canvas.toDataURL("image/png"));
$('form input[name=width]').val(canvas.width);
$('form input[name=height]').val(canvas.height);
$('form').submit();
}
Django POST Request View:
# in the module scope
from io import BytesIO
from PIL import Image
import re
import base64
# in your view function
image_data = request.POST['image_data']
image_width = int(request.POST['width'])
image_height = int(request.POST['height'])
image_data = re.sub("^data:image/png;base64,", "", image_data)
image_data = base64.b64decode(image_data)
image_data = BytesIO(image_data)
im = Image.open(image_data)
assert (image_width, image_height,) == im.size
Bump up the maximum POST size in your settings (example: ~20 MB):
# canvas data urls are large
DATA_UPLOAD_MAX_MEMORY_SIZE = 20_000_000
import re
datauri = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg=='
imgstr = re.search(r'base64,(.*)', datauri).group(1)
output = open('output.png', 'wb')
output.write(imgstr.decode('base64'))
output.close()
or if you need to load it into PIL :
import cStringIO
tempimg = cStringIO.StringIO(imgstr.decode('base64'))
im = Image.open(tempimg)