Mejorar la calidad de las imágenes que se suben o se importan en Prestashop

Hace unos días hemos hecho una página web para un cliente en Prestashop. Este cliente, tenía la peculiaridad (respecto a clientes anteriores) que disponía de unas imágenes con buena calidad. Al subirlas a Prestashop, tanto en la subida por producto, como en la importación masiva, la pérdida de calidad era más que evidente. Las fotos de Prestashop no tenían una calidad aceptable teniendo en cuenta las fotos de origen. Y en esa página, las imágenes eran clave.

La página la hemos creado en 1.7, pero lo probamos en 1.6 y el resultado era el mismo. Calidad muy por debajo de lo aceptable cuando las imágenes originales son de calidad (para imágenes “usuales” si que es funcional).
Obviamente modificamos todas las opciones de calidad en el backend de Prestashop ( Diseño > Ajustes de imágenes ), sin mejora importante del resultado.

Nos somos a los primeros a los que les pasó (ver aquí y aquí). Es un tema recurrente y sin resolver (“sorpresa” por parte de Prestashop).

Al final descubrimos por qué y cómo resolverlo. Os lo contamos en este artículo.

Cómo mejorar la calidad de las imágenes que se suben o se importan en Prestashop.

Lo primero es la causa que ocasiona esta pérdida de calidad. Prestashop comprime todas las imágenes al subirlas. Y crea varias imágenes de diferentes tamaños (que se definen en Diseño > Ajustes de imágenes ). Esto es lógico y bueno. El problema es que usa un método de compresión, GD2, que antes se usaba mucho por estar integrado en Php (o en la mayoría de las instalaciones). Sin embargo no es la librería que mejores resultados da, tiene pocas opciones y, además, creo que Php 7 ya no la incluye por defecto.

Después de varias pruebas infructuosas con GD, optamos por cambiar a Imagemagick siguiendo las indicaciones de un post al que enlazamos en los párrafos anteriores.

Siguiendo los resultados arreglaba algo la subida producto a producto, pero no la masiva. Y aún así, no conseguíamos los mejores resultados así que modificamos el proceso para lo que queríamos. Esto es lo que hicimos..

Para las subidas desde el backend.

Tenemos que:

  • Hacer un override (copiar en la carpeta override/classes) de la clase ImageManager.php porque queremos modificar la función resize para que use ImageMagick.
    Nota:  Para esto tu servidor tiene que tener ImageMagick o deberías poder instalarlo. Si no no funciona.
  • En ese fichero   override/classes/ImageManager.php ponemos lo siguiente:

    <?php

    class ImageManager extends ImageManagerCore
    {

    /**
    * Resize, cut and optimize image
    *
    * @param string $src_file Image object from $_FILE
    * @param string $dst_file Destination filename
    * @param int $dst_width Desired width (optional)
    * @param int $dst_height Desired height (optional)
    * @param string $file_type
    * @param bool $force_type
    * @param int $error
    * @param int $tgt_width
    * @param int $tgt_height
    * @param int $quality
    * @param int $src_width
    * @param int $src_height
    * @return bool Operation result
    */
    public static function resize2($src_file, $dst_file, $dst_width = null, $dst_height = null, $file_type = ‘jpg’,
    $force_type = false, &$error = 0, &$tgt_width = null, &$tgt_height = null, $quality = 5,
    &$src_width = null, &$src_height = null)
    {
    if (PHP_VERSION_ID < 50300) {
    clearstatcache();
    } else {
    clearstatcache(true, $src_file);
    }

    if (!file_exists($src_file) || !filesize($src_file)) {
    return !($error = self::ERROR_FILE_NOT_EXIST);
    }

    list($src_width, $src_height, $type) = getimagesize($src_file);

    // If PS_IMAGE_QUALITY is activated, the generated image will be a PNG with .jpg as a file extension.
    // This allow for higher quality and for transparency. JPG source files will also benefit from a higher quality
    // because JPG reencoding by GD, even with max quality setting, degrades the image.
    if (Configuration::get(‘PS_IMAGE_QUALITY’) == &