¿Cómo evitar que GD2 elimine los colores al cambiar el tamaño de las imágenes?

Desarrollé un sitio de comunidad para compartir fotos usando CodeIgniter 1.7. Las fotos cargadas por los miembros se redimensionan automáticamente en varios formatos, para lo cual utilizo la clase CodeIgniter Image Manipulation. Esta clase está integrada en el marco y básicamente es un contenedor de múltiples bibliotecas de manipulación de imágenes, como GD, GD2, ImageMagick y NETPBM. En mi host, solo puedo hacer uso de GD2, así que de eso se tratará esta pregunta.

En mi problema Aquí hay un ejemplo de una foto redimensionada en mi sitio. Tenga en cuenta que el original era muy grande, más de 3000 píxeles de ancho:

http://www.jungledragon.com/image/195/female_impala_close-up.html

Ahora, mira esa misma imagen, también redimensionada, un poco más grande en Flickr:

Female impala closeup

¿Ves la diferencia dramática? Estoy tratando de cerrar esa enorme brecha. Lo primero que hice fue aplicar un filtro de nitidez a las imágenes. Puedes ver el resultado aquí:

enter image description here

Aunque todavía no es perfecto, al menos se acerca al nivel de nitidez de la imagen de Flickr. El problema restante es que los colores desaparecen, como si su saturación disminuyera. Esto sucede antes del filtro de nitidez, por lo que debe estar en GD2.

Este tema es de vital importancia para mí, pero no sé dónde buscar. He encontrado algunos hilos .NET que hablan del submuestreo de crominancia, pero no sé qué hacer con esa información en mi configuración. Estoy buscando cualquier solución que funcione dentro de las limitaciones de mi configuración.

Actualización: Por este medio el archivo original, exactamente como lo cargué tanto en mi sitio como en Flickr:

http://www.jungledragon.com/img/DSC07275.jpg

Actualización 2 : estoy sorprendido. En el buen sentido. Me tomó mucho esfuerzo instalar ImageMagick pero después de cambiar a él (que era una cuestión de establecer ‘imagemgick’ como la biblioteca para usar en la clase de manipulación de imágenes Code Igniter, el resultado de la imagen de prueba es el siguiente:

enter image description here

El cambio de tamaño de ImageMagick lo está haciendo exactamente como se esperaba. Los colores se conservan, y la nitidez está allí. Sí, deshabilité mi rutina de nitidez personalizada ya que ya no es necesaria debido a ImageMagick. Además de eso, el proceso es mucho más rápido y menos memoria también. Y aquí viene otra gran parte: no puedo explicarlo, pero no hice absolutamente nada para decirle a ImageMagick que use un perfil de color específico, que fue sugerido por el usuario @Alix. En mis pruebas hasta ahora, parece que la información de color se respeta con o sin un perfil incrustado. La salida simplemente es una versión más pequeña de la entrada. ¿ImageMagick es tan inteligente o estoy soñando?

He logrado probar más esto con Imagick:

Prueba Imagick sRGB

La mitad izquierda de la imagen se procesó con Imagick y el perfil de color sRGB_IEC61966-2-1_no_black_scaling.icc , la mitad derecha no tiene un perfil de color asociado y muestra exactamente lo mismo si se procesa con Imagick o GD; aquí está el código que utilicé:

 header('Content-type: image/jpeg'); $image = new Imagick('/path/to/DSC07275.jpg'); if (($srgb = file_get_contents('http://www.color.org/sRGB_IEC61966-2-1_no_black_scaling.icc')) !== false) { $image->profileImage('icc', $srgb); $image->setImageColorSpace(Imagick::COLORSPACE_SRGB); } $image->thumbnailImage(1024, 0); echo $image; 

Aquí hay una comparación de los varios perfiles sRGB disponibles en el sitio web color.org:

Comparación de sRGB

Me parece que el tercer perfil produce los resultados más vívidos, aparte de eso, no tengo idea de cómo se haría una elección definitiva.


EDITAR : Aparentemente, Imagick viene con un perfil sRGB incluido, por lo que no necesita descargar el del sitio web de Image Color Consortium, el siguiente código debe manejar todos los escenarios:

 header('Content-type: image/jpeg'); $image = new Imagick('/path/to/DSC07275.jpg'); $version = $image->getVersion(); $profile = 'http://www.color.org/sRGB_IEC61966-2-1_no_black_scaling.icc'; if ((is_array($version) === true) && (array_key_exists('versionString', $version) === true)) { $version = preg_replace('~ImageMagick ([^-]*).*~', '$1', $version['versionString']); if (is_file(sprintf('/usr/share/ImageMagick-%s/config/sRGB.icm', $version)) === true) { $profile = sprintf('/usr/share/ImageMagick-%s/config/sRGB.icm', $version); } } if (($srgb = file_get_contents($profile)) !== false) { $image->profileImage('icc', $srgb); $image->setImageColorSpace(Imagick::COLORSPACE_SRGB); } $image->thumbnailImage(1024, 0); echo $image; 

Su imagen original tiene un perfil ICC de Adobe RGB (1998) adjunto. Creo que GD, al no conocer los perfiles, está interpretando los datos de imagen incorrectamente. Aquí hay un error de PHP relacionado que confirma esto.

Debería preparar la imagen con el perfil correcto, muy probablemente sRGB. Si tiene una aplicación que puede hacer eso, intente convertirla a sRGB y volver a cargarla.

Si necesita una solución permanente al problema, creo que necesitará una biblioteca de procesamiento de imágenes que pueda tratar con los perfiles. Para ser sincero, no sé cómo ImageMagick se ocupa de estas cosas, pero al menos está familiarizado con el concepto básico de los perfiles de color.

Relacionado: Comparación de sRGB y Adobe RGB

Tengo un poco de información para contribuir a este hilo. Soy fotógrafo y no desarrollador web, por lo que mi conocimiento técnico no es excelente, sin embargo, he estado lidiando con este problema, así que espero que esta publicación ayude a alguien más en el futuro.

Uso una herramienta de ventas de fotos en línea que remuestrea todas mis imágenes usando GD. Estaba teniendo problemas con las imágenes que parecían originales, incluso cuando las subía con la conversión sRGB adecuada y el perfil ICC adjunto, cuando las veía en mi monitor de gama amplia.

Lo que descubrí que es el problema es que GD elimina todos los metadatos y perfiles ICC de los archivos originales. Entonces los navegadores, al no ver ningún perfil, no los muestran correctamente. Es leve en un monitor de gama estándar, pero es muy obvio en una amplia gama.

Si tiene problemas con esto, puede probar mi teoría utilizando Firefox y cambiando una configuración en about: config. Cambie el valor de “gfx.color_management.mode” del valor predeterminado de “2” a “1”. Esta configuración obligará a Firefox a asumir que cualquier imagen sin un perfil ICC es sRGB y se mostrará como tal. Las imágenes deberían aparecer como es de esperar e idénticas a Photoshop / Lightroom / etc. Por qué todos los navegadores no usan este enfoque de sentido común ya que su valor predeterminado está más allá de mí.

Desafortunadamente, mi carrito de compras solo está configurado para usar PHP GD, por lo que no puedo obtener buenos resultados en este momento. Realmente me gustaría ver que GD se actualice para dejar los perfiles ICC adjuntos o tener la opción de agregar un perfil sRGB simple en la exportación.

Más información aquí: http://www.gballard.net/psd/go_live_page_profile/embeddedJPEGprofiles.html#

Encontré este script:

https://github.com/slavicv/jpeg-icc/blob/master/class.jpeg_icc.php

Este script copia el perfil de color de su imagen original en su nueva imagen. Entonces, después de cambiar el tamaño, puede agregar el perfil de color de su imagen original. Este script no necesita que Imagick haga el truco.