Hosting, Hosting para WordPress y Servidor Dedicado Gestionado

ImageMagick es una potente colección de herramientas para la línea de comandos que puede utilizarse con el fin de editar imágenes en el servidor. Esto te permite automatizar tareas como convertir, escalar o modificar imágenes directamente en tu espacio web, lo cual resulta ideal para procesar cargas en sistemas de gestión de contenidos o para adaptar dinámicamente imágenes mediante scripts.

En este artículo, te presentaremos los casos de uso más comunes:

  • cómo realizar un procesamiento básico de imágenes (conversión, redimensionado) a través de SSH

  • cómo habilitar el soporte PDF para un espacio web que está deshabilitado por defecto por razones de seguridad
  • cómo controlar la conversión de PDF de forma segura desde scripts PHP

Requisitos

  • Para poder utilizar los comandos de este artículo, debes conectarte a tu espacio web mediante SSH. Consulta las instrucciones sobre cómo establecer una conexión SSH en el siguiente enlace al artículo correspondiente: conexión SSH con PuTTY (Windows).

Edición de imágenes básica a través de SSH

La herramienta central de ImageMagick es el comando convert. Con este comando puedes editar imágenes directamente en la terminal.

Aquí tienes algunos ejemplos prácticos de uso:
 

Convertir el formato de imagen

Con ImageMagick puedes leer y escribir imágenes en más de 200 formatos, entre ellos PNG, JPEG, JPEG 2000, GIF, TIFF, DPX, EXR, WebP, PostScript, PDF y SVG.

Para convertir una imagen a otro formato, utiliza el comando convert según el esquema convert <fichero origen> <fichero destino>. El formato al que se convierte el archivo viene determinado por la extensión del archivo de destino. 

Por ejemplo, para copiar la imagen ejemplo.jpg en formato JPEG a formato PNG, introduce el comando de la siguiente manera:

convert ejemplo.jpg Blume.png


A la inversa (PNG → JPEG), funciona de la misma manera:

convert ejemplo.png Blume.jpg

 

Redimensionar imagen (cambiar la resolución)

Con ImageMagick también puedes cambiar la resolución y, por tanto, el tamaño de una imagen. Para ello, utiliza el comando convert junto con el parámetro resize .

Por ejemplo, para reducir a la mitad la resolución del archivo de imagen ejemplo.png (50%), utiliza el siguiente comando:

convert -resize 50% ejemplo.png

El siguiente comando redimensiona la imagen para que encaje en un rectángulo de 480 x 95 píxeles, manteniendo la relación de aspecto original. Por tanto, el resultado tendrá un ancho máximo de 480 píxeles y un alto máximo de 95 píxeles.

convert -resize 480x95 ejemplo.png

De forma predeterminada, ImageMagick mantiene la relación de aspecto de la imagen para evitar distorsiones. Sin embargo, si deseas forzar la imagen exactamente al tamaño de destino, incluso si esto provoca distorsiones, añade un signo de exclamación (!) justo después de la indicación del tamaño.

¡convert -resize 480x95! ejemplo.png

También es posible redimensionar las imágenes directamente al convertirlas a otro formato. Aquí tienes un ejemplo que combina la conversión de formato (JPEG → PNG) con un redimensionado al 50 %:

convert Blume.jpg -resize 50% ejemplo.png

 

 

Notas

En relación con el redimensionado, ten en cuenta que nos referimos a la resolución en píxeles y no al tamaño de visualización en la pantalla.

  • Si reduces la resolución en un 50 %, una imagen de 1000 x 1000 píxeles pasará a tener 500 x 500 píxeles. En lugar de un millón de píxeles, tendrás solo 250.000 píxeles; es decir, una cuarta parte de los píxeles de la imagen original.

  • Si comparas el original con la versión redimensionada directamente uno al lado del otro en la pantalla, la imagen redimensionada solo ocupará una cuarta parte de la superficie de la imagen original. Dicho de otro modo: en este caso, la imagen original es cuatro veces más grande que la imagen redimensionada.

Activar la compatibilidad con PDF

Nota

El soporte PDF no está disponible para los contratos adquiridos desde el 18/09/2025.

Por motivos de seguridad, el procesamiento de archivos PDF está desactivado en la configuración predeterminada de ImageMagick. No obstante, puedes habilitar esta función específicamente para tu espacio web creando tu propio archivo de configuración:

  • Crea el siguiente subdirectorio en el directorio principal (/) de tu espacio web. Puedes hacerlo a través de un cliente FTP o directamente por SSH con el comando mkdir -p ~/.config/ImageMagick.

    mkdir -p ~/.config/ImageMagick

  • Crea un archivo con el nombre policy.xml en este nuevo directorio. Puedes utilizar el editor nano a través de SSH, por ejemplo:

    nano ~/.config/ImageMagick/policy.xml

  • Copia el siguiente código XML por completo en el archivo policy.xml. Este código sobrescribe las directivas predeterminadas y permite el acceso de lectura y escritura para formatos como PDF, PS y EPS.

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE policymap [
    <!ELEMENT policymap (policy)+>
    <!ATTLIST policymap xmlns CDATA #FIXED ''>
    <!ELEMENT policy EMPTY>
    <!ATTLIST policy xmlns CDATA #FIXED '' domain NMTOKEN #REQUIRED
    name NMTOKEN #IMPLIED pattern CDATA #IMPLIED rights NMTOKEN #IMPLIED
    stealth NMTOKEN #IMPLIED value CDATA #IMPLIED>
    ]>
    <policymap>
    <policy domain="resource" name="memory" value="256MiB"/>
    <policy domain="resource" name="map" value="512MiB"/>
    <policy domain="resource" name="width" value="16KP"/>
    <policy domain="resource" name="height" value="16KP"/>
    <policy domain="resource" name="area" value="128MB"/>
    <policy domain="resource" name="disk" value="1GiB"/>
    <policy domain="resource" name="thread" value="2"/>
    <policy domain="delegate" rights="none" pattern="URL" />
    <policy domain="delegate" rights="none" pattern="HTTPS" />
    <policy domain="delegate" rights="none" pattern="HTTP" />
    <policy domain="path" rights="none" pattern="@*"/>
    <policy domain="coder" rights="read | write" pattern="{PS,PS2,PS3,EPS,XPS,PDF,PNG}" />
    <policy domain="module" rights="read | write" pattern="{PS,PS2,PS3,EPS,XPS,PDF,PNG}" />
    </policymap>

  • Guarda el archivo policy.xml. Si has creado el archivo localmente, súbelo mediante SFTP al directorio.config/ImageMagick.

La compatibilidad con PDF para ImageMagick ya está activa. Los cambios tendrán efecto inmediato.

Utilizar la conversión de PDF en scripts de PHP

Si deseas acceder a ImageMagick desde un script de PHP para procesar archivos PDF, es necesario un paso adicional. De forma predeterminada, los scripts de PHP no conocen la ruta de tu archivo archivo policy.xml por defecto. Debes darla a conocer a través de la variable de entorno HOME.

La ruta absoluta del directorio de tu espacio web (Document Root) es necesaria. Puedes ver cómo consultarla en el siguiente enlace al artículo correspondiente: determinar la ruta absoluta de un espacio web (document root).

El siguiente script PHP de ejemplo de muestra cómo configurar la variable de entorno y, a continuación, convertir un archivo PDF en un archivo JPG.

<?php

// Replace this path with the absolute path to your webspace directory.
$home_path = "/homepages/12/d123456789/htdocs";

// Sets the HOME environment variable so that ImageMagick finds the policy.xml.
putenv("HOME=" . $home_path);

// Define the full path to the files and the convert tool.
$pdf_file = $home_path . "/document.pdf";
$jpg_file = $home_path . "/preview.jpg";
$convert_path = "/usr/bin/convert";

// Assemble the command and execute it.
// The addition [0] ensures that only the first page of the PDF is converted.
$command = $convert_path . " " . escapeshellarg($pdf_file . "[0]") . " " . escapeshellarg($jpg_file);
$output = shell_exec($command);

// Optional: Display output or error (for debugging)
if ($output) {
   echo "Error output: " . $output;
} else {
   echo "Conversion started successfully.";
}

?>

Advertencia

La función shell_exec( ) ejecuta comandos de shell directamente en el servidor. Asegúrate siempre de que ninguna entrada de usuarios que no hayan sido saneados (p. ej., nombres de ficheros en un formulario de carga de archivos) llegue directamente al comando; de este modo, evitarás vulnerabilidades de seguridad como la inyección de comandos. Utiliza funciones como escapeshellarg() para proteger las rutas de los archivos.