En el post de hoy te mostraré una cosa sencilla pero muy útil: cómo enviar un canvas de HTML a PHP usando JavaScript, para guardar ese canvas como imagen.

Cuando digo que es útil es porque yo creo que canvas nos da varias posibilidades de trabajar con imágenes o con el canvas en sí, y gracias a lo que te mostraré podrás guardar el resultado en el servidor para cualquier cosa.

Se me ocurre que por ejemplo podrías tomar una foto de una credencial de identificación, recortarla y después guardarla con PHP.

Preparando el canvas

El canvas o lienzo de HTML puede ser de cualquier cosa. Yo simplemente le dibujaré una figura geométrica, pero te repito que el contenido del mismo puede ser cualquier cosa.

const ALTURA_CANVAS = 200,
  ANCHURA_CANVAS = 400;

const $btnEnviar = document.querySelector("#btnEnviar");
const $canvas = document.querySelector("#canvas");
// Simple función que dibuja algo en el canvas, solo de ejemplo
// Tomado de: [https://parzibyte.me/blog/posts/dibujar-figuras-geometricas-canvas-javascript/](https://parzibyte.me/blog/posts/dibujar-figuras-geometricas-canvas-javascript/)
const dibujarEnCanvas = () => {
  // Obtener el elemento del DOM
  $canvas.width = ANCHURA_CANVAS;
  $canvas.height = ALTURA_CANVAS;
  // Del canvas, obtener el contexto para poder dibujar
  const contexto = $canvas.getContext("2d");
  // Estilo de dibujo
  // Grosor de línea
  contexto.lineWidth = 5;
  // Color de línea
  contexto.strokeStyle = "#212121";
  // Color de relleno
  contexto.fillStyle = "#D4E157";
  // Comenzamos la ruta de dibujo, o path
  contexto.beginPath();
  // Esquina superior izquierda
  contexto.moveTo(35, 5);
  // Línea recta superior
  contexto.lineTo(95, 5);
  // Esquina central derecha
  contexto.lineTo(125, 55);
  // Esquina inferior derecha
  contexto.lineTo(95, 105);
  // Línea recta inferior
  contexto.lineTo(35, 105);
  // Esquina central izquierda
  contexto.lineTo(5, 55);
  // Y dejamos que la última línea la dibuje JS
  contexto.closePath();
  // Hacemos que se dibuje
  contexto.stroke();
  // Lo rellenamos
  contexto.fill();
}

Lo importante hasta aquí es que ya tenemos un canvas y tenemos un dibujo en el mismo. Ahora veamos cómo enviarlo.

Enviar canvas con JavaScript

En el código anterior te mostré cómo dibujarle algo al canvas y también definí un botón que enviará el canvas como imagen a PHP. Entonces queda así:

$btnEnviar.onclick = async () => {
  // Convertir la imagen a Base64 y ponerlo en el enlace
  const data = $canvas.toDataURL("image/png");
  const fd = new FormData();
  fd.append("imagen", data); // Se llama "imagen", en PHP lo recuperamos con $_POST["imagen"]
  const respuestaHttp = await fetch("imagen.php", {
    method: "POST",
    body: fd,
  });
  const nombreImagenSubida = await respuestaHttp.json();
  console.log("La imagen ha sido enviada y tiene el nombre de: " + nombreImagenSubida);
};

En la línea 3 convertimos el canvas a imagen PNG (también se puede JPG), luego creamos un nuevo FormData para enviar la imagen codificada y lo enviamos usando fetch a nuestro servidor con Apache y PHP.

PHP nos debe responder con el nombre de la imagen que se acaba de subir, y en ese caso lo mostramos en la consola.

Recibir imagen en PHP

Ahora en el lado del servidor tendremos la imagen en base64 o base 64, como sea que se diga. Le removemos la parte que dice “image/png” y escribimos el contenido decodificado (con base64_decode) dentro de un archivo.

Ten en cuenta que si en el paso anterior enviaste la imagen como jpg entonces debes remover la parte que dice image/jpeg.

<?php
$imagenCodificada = $_POST["imagen"];
$imagenCodificadaLimpia = str_replace("data:image/png;base64,", "", $imagenCodificada);
$imagenDecodificada = base64_decode($imagenCodificadaLimpia);
$nombreImagenGuardada = "imagen_" . uniqid() . ".png";
file_put_contents($nombreImagenGuardada, $imagenDecodificada);
echo json_encode($nombreImagenGuardada);

Al final imprimimos el nombre de la imagen guardada con PHP codificada como JSON, el cliente la va a recibir y después mostrará el nombre en la consola.

Poniendo todo junto

Canvas enviado como imagen desde JavaScript a PHP

El código completo del lado del cliente queda así:

<!DOCTYPE html>
<html lang="es">

<head>
	<meta charset="UTF-8">
	<meta http-equiv="X-UA-Compatible" content="IE=edge">
	<meta name="viewport" content="width=device-width, initial-scale=1.0">
	<title>Enviar canvas de JavaScript a PHP</title>
</head>

<body>
	<canvas id="canvas"></canvas>
	<br>
	<button id="btnEnviar">Enviar a PHP</button>
	<script>
		const ALTURA_CANVAS = 200,
			ANCHURA_CANVAS = 400;

		const $btnEnviar = document.querySelector("#btnEnviar");
		const $canvas = document.querySelector("#canvas");
		// Simple función que dibuja algo en el canvas, solo de ejemplo
		// Tomado de: [https://parzibyte.me/blog/posts/dibujar-figuras-geometricas-canvas-javascript/](https://parzibyte.me/blog/posts/dibujar-figuras-geometricas-canvas-javascript/)
		const dibujarEnCanvas = () => {
			// Obtener el elemento del DOM
			$canvas.width = ANCHURA_CANVAS;
			$canvas.height = ALTURA_CANVAS;
			// Del canvas, obtener el contexto para poder dibujar
			const contexto = $canvas.getContext("2d");
			// Estilo de dibujo
			// Grosor de línea
			contexto.lineWidth = 5;
			// Color de línea
			contexto.strokeStyle = "#212121";
			// Color de relleno
			contexto.fillStyle = "#D4E157";
			// Comenzamos la ruta de dibujo, o path
			contexto.beginPath();
			// Esquina superior izquierda
			contexto.moveTo(35, 5);
			// Línea recta superior
			contexto.lineTo(95, 5);
			// Esquina central derecha
			contexto.lineTo(125, 55);
			// Esquina inferior derecha
			contexto.lineTo(95, 105);
			// Línea recta inferior
			contexto.lineTo(35, 105);
			// Esquina central izquierda
			contexto.lineTo(5, 55);
			// Y dejamos que la última línea la dibuje JS
			contexto.closePath();
			// Hacemos que se dibuje
			contexto.stroke();
			// Lo rellenamos
			contexto.fill();
		}
		$btnEnviar.onclick = async () => {
			// Convertir la imagen a Base64 y ponerlo en el enlace
			const data = $canvas.toDataURL("image/png");
			const fd = new FormData();
			fd.append("imagen", data); // Se llama "imagen", en PHP lo recuperamos con $_POST["imagen"]
			const respuestaHttp = await fetch("imagen.php", {
				method: "POST",
				body: fd,
			});
			const nombreImagenSubida = await respuestaHttp.json();
			console.log("La imagen ha sido enviada y tiene el nombre de: " + nombreImagenSubida);
		};

		dibujarEnCanvas();
	</script>
</body>

</html>

Y del servidor así:

<?php
$imagenCodificada = $_POST["imagen"];
$imagenCodificadaLimpia = str_replace("data:image/png;base64,", "", $imagenCodificada);
$imagenDecodificada = base64_decode($imagenCodificadaLimpia);
$nombreImagenGuardada = "imagen_" . uniqid() . ".png";
file_put_contents($nombreImagenGuardada, $imagenDecodificada);
echo json_encode($nombreImagenGuardada);

Si te gustan estos lenguajes te invito a ver más sobre PHP y JavaScript en mi blog.

Si el post ha sido de tu agrado te invito a que me sigas para saber cuando haya escrito un nuevo post, haya actualizado algún sistema o publicado un nuevo software. Facebook | X | Instagram | Telegram | También estoy a tus órdenes para cualquier contratación en mi página de contacto