Necesito cargar los datos de imagen del lienzo en el servidor (base de datos) sobre la marcha, es decir, necesito crear un formulario y con una entrada = archivo, y publicar los datos de imagen sin ninguna interacción del usuario.Carga de datos de imagen 'canvas' en el servidor
Respuesta
No es necesario un archivo de entrada, acaba de obtener los datos con ctx.getImageData()
y que lo ponga al servidor con el Ajax.
Ver el MDN Documentation for CanvasRenderingContext2D.getImageData()
.
Pero no podrá obtener los datos de imagen en IE, incluso con ExCanvas
.
Puede obtener los datos de la imagen en forma de datos: url, esto solo funciona en Firefox y Opera hasta ahora.
... y Safari (y cualquier otro navegador basado en WebKit) – olliej
FWIW, así es como lo conseguí trabajando.
Mi servidor está en el motor de la aplicación de google. Envío el resultado de canvas.toDataURL() como parte de una solicitud posterior usando jQuery.post. La URL de datos es datos de imagen codificados en base64. Así en el servidor que descodificarlo y convertirlo en la imagen
import re
import base64
class TnUploadHandler(webapp.RequestHandler):
dataUrlPattern = re.compile('data:image/(png|jpeg);base64,(.*)$')
def post(self):
uid = self.request.get('uid')
img = self.request.get('img')
imgb64 = self.dataUrlPattern.match(img).group(2)
if imgb64 is not None and len(imgb64) > 0:
thumbnail = Thumbnail(
uid = uid, img = db.Blob(base64.b64decode(imgb64)))
thumbnail.put()
Desde el cliente que envío los datos de la siguiente manera:
$.post('/upload',
{
uid : uid,
img : canvas.toDataURL('image/jpeg')
},
function(data) {});
esto puede no ser la mejor manera de hacerlo, pero funciona.
Gracias funciona como la mantequilla :) :) – Surya
el argumento img se cortará si es demasiado grande, tiene ¿Alguna vez te has encontrado con eso? – ernest
@ernest Tengo la búsqueda de las restricciones de publicación que mencionaste (sabía acerca de la limitación de solicitud de obtención) y no encuentro que http://www.w3schools.com/tags/ref_httpmethods.asp W3school diga "Las solicitudes POST no tienen restricciones en la longitud de datos " – ccsakuweb
Aquí hay una demostración de una aplicación de firma en línea que escribí el año pasado Canvas Signature Demo. Esto tiene la ventaja de publicar solo los datos vectoriales en el servidor. Con toda la información de ruta, también puede aplicar algoritmos de suavizado o escalarla según sea necesario antes de continuar.
<canvas id="signature" width="300" height="100"></canvas>
<form method="post" id="signature_form" action="signing.aspx">
<input type="hidden" name="paths" id="paths"/>
<p><label>Cover #</label> <input type="text" id="covernumber" name="covernumber"/>
<input type="submit" id="save" value="Save"/>
</form>
Guardo los datos de la ruta en un campo oculto y los publico en el servidor.
signature.js lógica de la base de abajo:
mouseDown: function(event) {
var point = this.getRelativePoint(event);
this.paths.push([ point ]);
this.ctx.fillRect(point.x,point.y,1,1);
this.penDown = true;
this.updateField();
},
mouseUp: function(event) {
this.penDown = false;
this.ctx.closePath();
if (Prototype.Browser.IE && event.srcElement.tagName != "INPUT") {
var ver = getInternetExplorerVersion();
if (ver >= 8 && ver < 9 && document.selection) {
document.selection.empty();
}
}
},
mouseMove: function(event) {
if (this.penDown) {
var lastPath = this.paths[ this.paths.length - 1 ];
var lastPoint = lastPath[ lastPath.length - 1 ];
var point = this.getRelativePoint(event);
lastPath.push(point);
this.ctx.strokeStyle = "#000000";
this.ctx.beginPath();
this.ctx.moveTo(lastPoint.x,lastPoint.y);
this.ctx.lineTo(point.x, point.y);
this.ctx.stroke();
this.ctx.closePath();
this.updateField();
}
},
updateField: function() {
if (this.field) {
this.field.value = this.paths.toJSON();
}
}
Aquí está mi código .Net lado del servidor correspondiente (C#).
if (Request("paths")) {
var objBitmap : Bitmap = new Bitmap(300, 100);
var objGraphics : Graphics = Graphics.FromImage(objBitmap);
objGraphics.Clear(Color.Transparent);
objGraphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
var paths:Array = eval(Request("paths")) || [];
var p : int;
var q : int;
var path : Array;
for (p = 0; p< paths.length; p++) {
var path = paths[p];
if (path.length == 1) {
objGraphics.DrawRectangle(new Pen(Color.Black), path[0].x, path[0].y, 1, 1);
} else {
for (q = 1; q<path.length; q++) {
var prev = path[q-1];
var curr = path[q];
objGraphics.DrawLine(new Pen(Color.Black), parseInt(prev.x),parseInt(prev.y),parseInt(curr.x),parseInt(curr.y));
}
}
}
objBitmap.Save("C:\\temp\\" + Request("covernumber") + ".png", ImageFormat.Png);
objBitmap.Dispose();
objGraphics.Dispose();
}
Así es como he resuelto esto. Publicando la imagen como una matriz base64 usando JavaScript y luego decodificándola y guardándola como una imagen usando PHP.
lado del cliente (JavaScript):
$.post('/ajax/uploadthumbnail',
{
id : id,
img : canvas.toDataURL("image/png")
}, function(data) {
console.log(data);
});
lado del servidor (PHP):
$img = $_POST['img'];
$img = str_replace('data:image/png;base64,', '', $img);
$img = str_replace(' ', '+', $img);
$data = base64_decode($img);
$file = $_SERVER['DOCUMENT_ROOT'] . '/images/some_name.png';
file_put_contents($file, $data);
- 1. ¿Genera datos de imagen de Canvas en el lado del servidor?
- 2. Datos de origen cruzado en canvas HTML5
- 3. HTML5 save canvas to file en el servidor
- 4. Canvas HTML5: ¿Cómo hacer una rueda giratoria de carga girando la imagen en grados?
- 5. HTML5 Canvas Escala de imagen Edición
- 6. Strange HTML5 Canvas drawComportamiento de la imagen
- 7. C# mvc carga de imágenes redimensionando el lado del servidor
- 8. Conversión de imagen a Canvas/HTML5
- 9. Detectar carga de imagen
- 10. ¿Cómo mostrar la imagen con datos de carga WebView?
- 11. Carga masiva: "final inesperado de archivo" en el nuevo servidor
- 12. Crear imagen 3D de anáglifo en canvas HTML5
- 13. Archivos de carga de rieles en el servidor ftp
- 14. ¿Qué formatos de imagen son compatibles con CANVAS en html5?
- 15. Android: imagen/contenido de carga de WebView en el centro
- 16. Conversión del elemento Canvas en Image y almacenamiento en la base de datos
- 17. Carga de imagen optimizada en un UIScrollView
- 18. utilizando HTML5 Canvas: gire la imagen sobre el punto arbitrario
- 19. Evento de carga de imagen después de cargar la imagen
- 20. Mostrando imagen de carga con getJSON
- 21. Obtener imagen de URL/servidor
- 22. callback de carga de imagen jQuery
- 23. ¿Cómo puedo guardar el archivo de imagen generado por la etiqueta canvas con heatmap.js?
- 24. Carga de la imagen de Android-Django
- 25. servidor web Herramienta de prueba de carga
- 26. ¿Cómo escribir texto sobre la imagen en canvas HTML5?
- 27. HTML5 Canvas como fondo de la imagen CSS?
- 28. ListView estrategia de carga asíncrona imagen
- 29. Carga lenta de la imagen Flexslider
- 30. Carga de imagen para imágenes estáticas
¿Alguien consiguió que esto funcione realmente ? Obtuve que los datos devueltos de getImageData() pueden ser POST enviados al servidor, pero no puedo entender cómo. Intenté usar diferentes opciones en jQuery.ajax y jQuery.post, pero no pude encontrar la forma de especificar los datos de imagen en la solicitud ajax. Mi servidor no puede interpretar los datos que envío. No pude encontrar ningún ejemplo de código tampoco. ¿Tienes algún puntero? (Me aseguré de que el servidor funcionara correctamente haciendo la misma solicitud con Curl como cliente.) Gracias. – Jayesh
bien, lo tengo funcionando. código pegado en la respuesta. – Jayesh
Es posible usarlo en IE con fxCanvas (no con ExCanvas). Necesita usar la función toDataURL ("image/png", function (fxUrl) {...}). –