php

Recortar foto con PHP

Hoy voy a enseñarte a recortar una foto con PHP dando al usuario la posibilidad de recortar una foto y luego guardarla en el servidor con PHP.

De este modo vamos a darle al usuario la opción de recortar una imagen y guardar el resultado en PHP. Luego ya puedes ligar esa foto o imagen a una base de datos, alojarla en el servidor, usarla para crear otra imagen, etcétera.

Usaremos Cropper.js en el lado del cliente y después enviaremos el resultado a PHP. Con esto vamos a ahorrar recursos pues el recorte de la foto se hará del lado del cliente pero al final prácticamente vamos a recortar la foto con PHP.

Explicación

Básicamente vamos a usar dos cosas que ya he expuesto en mi blog. La primera es cómo recortar una foto con JS, pero en este caso no vamos a descargarla, sino enviarla al servidor como expliqué en mi post de enviar un canvas a PHP.

Nota: recuerda que la imagen puede venir de cualquier lugar. Yo usaré una imagen estática por simplicidad.

Preparando interfaz para recortar

Primero veamos el código HTML en donde mostramos la imagen a recortar e iniciamos la librería de Cropper.js. También ahí estamos importando la librería y todo eso:

<!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>Recortar imagen con JavaScript - By Parzibyte</title>
 <script src="js/cropper.min.js"></script>
 <script src="js/script.js"></script>
 <link rel="stylesheet" href="css/cropper.min.css">
 <link rel="stylesheet" href="css/estilo.css">
</head>

<body>
 <div style="text-align: center;">
  <h1>Recortar imagen con JavaScript</h1>
  <br>
  <button id="subir">Subir recorte a PHP</button>
  <br>
  <a href="https://parzibyte.me/blog">By Parzibyte</a>
  <br>
  <img src="video-game-2234745_1920.jpg" id="imagen">
 </div>
</body>

</html>

Presta atención a dos elementos. El primero es el botón con el id subir, que va a enviar la imagen recortada al servidor con PHP.

El segundo elemento es la imagen con el id imagen, el src de esta imagen es la que vamos a poner para que se recorte.

Enviar foto recortada a PHP

Una vez que el usuario haga clic en el botón, se va a obtener el canvas y se subirá a PHP.

document.addEventListener("DOMContentLoaded", () => {
 const $btnSubir = document.querySelector("#subir");
 const $imagen = document.querySelector("#imagen");

 let cropper = new Cropper($imagen, {
  responsive: false, // <-- Si no se pone en false, la imagen se mueve cuando cambia el tamaño de la ventana
 });

 $btnSubir.onclick = async () => {
  if (!cropper) {
   return;
  }
  // Obtener el canvas recortado
  const canvas = cropper.getCroppedCanvas();

  // 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);

 };

});

Primero obtenemos el lienzo recortado con getCroppedCanvas, luego lo convertimos a imagen como base64 y lo enviamos a nuestro servidor PHP usando fetch.

El servidor nos responderá con el nombre de la imagen que acabamos de subir. Esto no es obligatorio, solo es para mostrar que podemos manejar la respuesta de PHP.

Fíjate en que enviamos la imagen con FormData y que vamos a recuperarla en PHP accediendo a $_POST en PHP con la clave imagen.

Recibir imagen recortada en PHP

Finalmente veamos el código para recibir la imagen en PHP. Recuerda que vamos a recibir la imagen en base64 así que debemos decodificarla, calcular un nombre único y escribir el contenido en un archivo.

<?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);

Poniendo todo junto

Recortar imagen con PHP y Cropper JS

El código completo del lado del cliente y servidor te lo dejo en mi GitHub. Y así es como podemos dejar que el usuario recorte una foto con PHP y después procesarla para cualquiera de nuestras necesidades.

En mi blog tengo más entradas sobre PHP y JavaScript.

Estoy aquí para ayudarte 🤝💻


Estoy aquí para ayudarte en todo lo que necesites. Si requieres alguna modificación en lo presentado en este post, deseas asistencia con tu tarea, proyecto o precisas desarrollar un software a medida, no dudes en contactarme. Estoy comprometido a brindarte el apoyo necesario para que logres tus objetivos. Mi correo es parzibyte(arroba)gmail.com, estoy como@parzibyte en Telegram o en mi página de contacto

No te pierdas ninguno de mis posts 🚀🔔

Suscríbete a mi canal de Telegram para recibir una notificación cuando escriba un nuevo tutorial de programación.
parzibyte

Programador freelancer listo para trabajar contigo. Aplicaciones web, móviles y de escritorio. PHP, Java, Go, Python, JavaScript, Kotlin y más :) https://parzibyte.me/blog/software-creado-por-parzibyte/

Ver comentarios

  • Hola, vi tu articulo y me sorprende la simplicidad con la que lo creaste, no soy programador ni mucho menos, pero me gusta este mundo, actualmente me gustaria comenzar con Kotlin para hacer algun app (sencilla), muchos saludos tus articulos son muy interesantes

Entradas recientes

Desplegar PWA creada con Vue 3, Vite y SQLite3 en Apache

Ya te enseñé cómo convertir una aplicación web de Vue 3 en una PWA. Al…

3 días hace

Arquitectura para wasm con Go, Vue 3, Pinia y Vite

En este artículo voy a documentar la arquitectura que yo utilizo al trabajar con WebAssembly…

3 días hace

Vue 3 y Vite: crear PWA (Progressive Web App)

En un artículo anterior te enseñé a crear un PWA. Al final, cualquier aplicación que…

3 días hace

Errores de Comlink y algunas soluciones

Al usar Comlink para trabajar con los workers usando JavaScript me han aparecido algunos errores…

3 días hace

Esperar promesa para inicializar Store de Pinia con Vue 3

En este artículo te voy a enseñar cómo usar un "top level await" esperando a…

3 días hace

Solución: Apache – Server unable to read htaccess file

Ayer estaba editando unos archivos que son servidos con el servidor Apache y al visitarlos…

4 días hace

Esta web usa cookies.