muestra mostrar img imagenes files example javascript python django canvas python-imaging-library

javascript - mostrar - img django



Cargue un lienzo html5 en una imagen PIL con Django (2)

Intento obtener el contenido de un lienzo html5 y pasarlo a mi servidor django, donde se manipulará con PIL y se guardará como PNG. Esto es lo que tengo hasta ahora:

Desde el formulario HTML, el usuario hace clic en el botón "actualizar", el contenido del lienzo - con canvas.toDataURL () - se descarga en un cuadro de texto que se envía a través de un formulario POST. Eventualmente esto será automático, pero no por ahora.

<input type="text" id="canvasData" name="canvasData"/> <input type=''button'' value="update" onclick=''jscript:updateData();''> <canvas id="sketch"></canvas> <script type="text/javascript"> function jscript:updateData() { $(''#canvasData'')[0].value = $(''canvas'')[0].toDataURL(); } </script>

El canvasData tiene la forma de ''datos: image / png; base64, iVBORw0KGgoAAAA ... etc ... ='' cuando se envía de nuevo. Entonces lo trato en django:

from PIL import Image ... canvasData = request.POST.get(''canvasData'', '''') im = Image.somehowLoad(canvasData) ... im.save(''canvas.png'')

Y aquí es donde estoy atascado. No puedo entender cómo obtener la URL de datos codificada en base64 para cargar la imagen en una forma utilizable con PIL.

¡Gracias!

editar: aquí está el código para el comentario inferior:

>>> d ''data:image/png;base64,iVBORw0K'' >>> d.strip(''data:image/png;base64,'') ''VBORw0K''


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()

o si necesita cargarlo en PIL:

import cStringIO tempimg = cStringIO.StringIO(imgstr.decode(''base64'')) im = Image.open(tempimg)


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(); }

Vista de solicitud POST de Django:

# in the module scope from io import BytesIO from PIL import Image import re # 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

Incremente el tamaño máximo de POST en su configuración (ejemplo: ~ 20 MB):

# canvas data urls are large DATA_UPLOAD_MAX_MEMORY_SIZE = 20_000_000