instalar generate php image gd

php - generate - El color de la imagen se arruinó al cambiar su tamaño usando imagecopyresampled



png php (4)

Después de subir las imágenes a mi sitio web, las imágenes se están redimensionando. Estoy usando las funciones imagecreatefromjpeg y imagecopyresampled . He notado que el color no es el mismo que en la imagen original.

Aquí puedes ver la diferencia. Puede ver la imagen de parpadeo con los colores de currect y detrás de la imagen de mi sitio web.

La imagen original: https://c2.staticflickr.com/6/5754/23693488109_74c67f012a_k.jpg

Después de actualizar: https://www.isrart.co.il/img/uploads/art/viewer/big/photo-2b971e861c7aa2c57b8f7667ec666c3d.jpg

Aquí está mi código PHP:

$type = @getImageSize($_FILES[''photo''][''tmp_name''])[2]; switch ($type) { case 1 : $img = imageCreateFromGif($_FILES[''photo''][''tmp_name'']); break; case 2 : $img = imageCreateFromJpeg($_FILES[''photo''][''tmp_name'']); break; case 3 : $img = imageCreateFromPng($_FILES[''photo''][''tmp_name'']); break; case 6 : $img = imageCreateFromBmp($_FILES[''photo''][''tmp_name'']); break; } $orig_width = imagesx($img); if($orig_width < $width) return $img; $orig_height = imagesy($img); $height = (($orig_height * $width) / $orig_width); $new_image = imagecreatetruecolor($width, $height); imagecopyresampled($new_image, $img, 0, 0, 0, 0, $width, $height, $orig_width, $orig_height); imagejpeg($new_image, $_SERVER[''DOCUMENT_ROOT''] . "/img/uploads/" . $path, 100);


Estoy seguro de que es un archivo PNG y que contiene un fragmento de información llamado "gAMA". Es una especie de corrección de gamma, algunos espectadores lo usan, otros no. Cuando carga su imagen, la biblioteca GD ignora esta información. Pero Imagick debería hacer el truco:

http://php.net/manual/en/imagick.getimageproperties.php

Espero que esto ayude.


Extendiendo sobre la respuesta de @Mark Setchell:

Utilice este archivo para copiar el perfil ICC de la imagen original para cambiar el tamaño del perfil ICC de la imagen. Que el problema se resuelva. Es un archivo único sin ninguna dependencia.

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

Para mi caso de uso edité un archivo, por lo que funciona con imágenes en la memoria que no utilizan el sistema de archivos.


La razón por la cual la imagen comprimida parece aburrida en comparación con la original es su formato de color. El original utiliza submuestreo de croma 4: 4: 4, mientras que el comprimido utiliza el submuestreo 4: 2: 0. Esto provoca la pérdida de información de color.

Para superar esto, podemos hacer esta escala usando ffmpeg o avconv y eso puede ejecutarse desde shell en PHP.

Produje una imagen escalada de buena calidad usando avconv con los siguientes 2 comandos.

avconv -i Input.jpg -pix_fmt yuvj444p -vf scale=1110:1570 Output.yuv avconv -y -s 1110x1570 -f rawvideo -pix_fmt yuv444p -i Output.yuv Output.jpg


Su imagen original tiene un perfil ICC de 560 bytes asociado, mientras que su imagen remuestreada no lo tiene.

Puedes extraer el perfil de la imagen original usando ImageMagick de esta manera:

convert orig.jpg profile.icm

Puedes verlo aquí si diferencio los dos archivos:

Observo que, si vuelvo a muestrear su imagen original en la línea de comandos con ImageMagick, así:

convert orig.jpg -resize 1110x1570! myresampled.jpg

entonces el perfil ICC se lleva adelante. Puedo comprobar así:

identify -verbose orig.jpg myresampled.jpg | grep -i profile Profiles: Profile-icc: 560 bytes Profiles: Profile-icc: 560 bytes