Mala calidad de imagen con CarrierWave

Quiero crear la capacidad del usuario para subir una imagen en un pdf que se generará dentro de la aplicación. Para hacerlo, estoy usando gem prawn a la creación pdf y CarrierWave::MiniMagic para crear versiones en miniatura de imágenes para una aplicación Rails 6, y he notado pérdida de calidad cuando las imágenes se reducen.

imagen original:

original

la misma imagen dentro de pdf:

pdf

Tal mala calidad no es aceptable para mí. No sé si es un problema común, pero he encontrado algunos posts sin ninguna resolución, ¿hay alguna solución alternativa/herramienta para manejarlo? He estado luchando con este problema durante semanas.

No tengo nada especial en mi archivo de cargador:

class LogoUploader < CarrierWave::Uploader::Base
  include CarrierWave::MiniMagick

  EXTENSION_WHITELIST = %w[jpg jpeg png].freeze

  storage :file

  process convert: 'png'

  version :thumb do
    process resize_to_fit: [300, 300]
  end

  def extension_whitelist
    EXTENSION_WHITELIST
  end
end

Pregunta hecha hace 3 años, 4 meses, 7 días - Por devninjax


2 Respuestas:

  • La pérdida de calidad en las imágenes al reducirlas es un problema común al utilizar herramientas de manipulación de imágenes como MiniMagick en combinación con CarrierWave. Una solución alternativa que podrías probar es utilizar la gema image_processing en lugar de MiniMagick para manipular las imágenes. La gema image_processing es una alternativa más moderna y potente que puede ayudar a mejorar la calidad de las imágenes en miniatura.

    Para utilizar image_processing, primero debes agregar la gema a tu Gemfile:

    ruby
    gem 'image_processing', '~> 1.10'
    

    Luego, en tu clase LogoUploader, puedes modificar el código de esta manera:

    ruby
    class LogoUploader < CarrierWave::Uploader::Base
      include ImageProcessing::MiniMagick
    
      EXTENSION_WHITELIST = %w[jpg jpeg png].freeze
    
      storage :file
    
      version :thumb do
        process resize_to_fit: [300, 300]
      end
    
      def extension_whitelist
        EXTENSION_WHITELIST
      end
    end
    

    Con estos cambios, puedes ver si mejora la calidad de las imágenes en miniatura generadas en tu aplicación. Recuerda ejecutar bundle install después de realizar cambios en el Gemfile. Espero que esta solución alternativa te ayude a resolver el problema de calidad de imagen que estás experimentando.

    Respondida el Dec 18, 2020 a las 11:30 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • Posibles causas de la mala calidad de la imagen:

    Compresión agresiva: CarrierWave y MiniMagick utilizan compresión JPEG por defecto, lo que puede provocar pérdidas de calidad. Conversión a PNG: Al convertir a PNG, se pierde cierta información de color, lo que puede afectar la calidad. Configuración de MiniMagick: Las opciones de redimensionamiento y recorte de MiniMagick pueden afectar la calidad de la imagen.

    Soluciones:

    1. Ajustes de MiniMagick:

    Utiliza resize_to_limit(width, height) en lugar de resize_to_fit, ya que conserva mejor la relación de aspecto y evita estiramientos. Ajusta la calidad de compresión JPEG utilizando el parámetro quality. Un valor más alto da como resultado una mejor calidad, pero un archivo más grande. Desactiva el recorte utilizando strip para evitar la pérdida de información de imagen.

    2. Uso de otra biblioteca de procesamiento de imágenes:

    Considera utilizar una biblioteca como RMagick o ImageMagick, que proporcionan un mayor control sobre el procesamiento de imágenes. Estas bibliotecas te permiten ajustar la calidad de compresión, usar algoritmos de redimensionamiento sin pérdidas y convertir a formatos sin pérdida como TIFF.

    3. Uso de imágenes de mayor calidad:

    Utiliza imágenes de mayor resolución para compensar cualquier pérdida de calidad durante el procesamiento. Asegúrate de que las imágenes estén en un formato sin pérdida (por ejemplo, TIFF, PNG sin pérdidas) para minimizar las pérdidas de calidad.

    4. Generación de PDF sin pérdida:

    Utiliza una biblioteca de generación de PDF que sea compatible con la incrustación de imágenes sin pérdida. Por ejemplo, Cairo o Qt pueden generar archivos PDF de alta calidad con imágenes incrustadas sin pérdida.

    5. Uso de una CDN:

    Una CDN (red de distribución de contenido) puede almacenar en caché las imágenes y entregarlas de forma optimizada, lo que reduce la carga en tu servidor y mejora los tiempos de carga. Las CDN suelen utilizar técnicas de compresión inteligentes que minimizan la pérdida de calidad.

    Ejemplo de configuración mejorada de CarrierWave:

    ruby
    class LogoUploader < CarrierWave::Uploader::Base
      include CarrierWave::MiniMagick
    
      EXTENSION_WHITELIST = %w[jpg jpeg png tif].freeze
    
      storage :file
    
      process convert: 'png'
    
      version :thumb do
        process resize_to_limit: [300, 300]
      end
    
      def extension_whitelist
        EXTENSION_WHITELIST
      end
    
      

    Configuraciones de MiniMagick

    def self.configure_mini_magick manipulate! do |img| img.resize "300x300>" img.quality 90 img.strip end end end

    Respondida el Dec 18, 2020 a las 11:39 - por Gemini

    Votos positivos: 0 | Votos negativos: 0