8768 sujets

Développement web côté serveur, CMS

Bonjour,

Je rencontre un soucis qui est peu connu avec la bibliothèque GD. En effet, pour des photos assez poussées ou retravaillées sur photoshop, lorsque l'on veut recréer ses images en PHP avec GD, les couleurs/ la teinte ne sont pas les bonnes.

Voyez :

Image d'origine : https://donnemoifaim.fr/imgs/alsacreations/photo_acceuil_3.jpg

Image recréée avec GD : https://donnemoifaim.fr/imgs/alsacreations/French-Burger-1.jpg

Entre l'un et l'autre il y à une légère baisse de la qualité global (on passe de 100 à 80) et du nombre de pixel total (1900px largueur l'original contre 1600px). Cela implique forcément un niveau de détails moins important, mais n'est en rien la cause de la différence de couleurs et de tinte (ou alors de manière imperceptible)

Mon code est plus poussé que dans les tutos php du web (inutile de me demander si j'ai bien ajouté imagecolorallocate par exemple). Le problème vient des IPTC ou de certains EXIFS qui ne sont pas récupérés lors de la copie avec imagecreatefromjpeg (beug déclaré par PHP).

En première piste, on m'a dit que imageMagick le faisait très bien lui, mais cela prendrait énormément de temps que de devoir tout refaire.

Donc j'ai réussis à faire en sorte de lire les IPTC de mon image d'origine pour les intégrer dans mon image finale avec ce code :


	if(!empty($image_origine)) {

		// Définit le drapeau IPTC
		$iptc = array(
			'2#080' => 'DonneMoiFaim',
			'2#116' => 'Copyright'. date('Y' , time()).' , DonneMoiFaim' ,
		);


		// On va définir si il y à des iptc à prendre de l'image d'origine
		$image = getimagesize($image_origine, $info);

		if(isset($info['APP13'])) {
			// On va rechercher les blocs de balise binaire
			$iptc_a_recuperer = iptcparse($info['APP13']);


			// On va intégrer les valeur seulement si c'est pas ce que l'on à déjà mis dans l'array d'avant
			foreach ($iptc_a_recuperer as $tagOrigine => $stringValue) {
				// On va intégrer cela à l'array $iptc
				if (!isset($iptc[$tagOrigine])) {
					$iptc[$tagOrigine] = $stringValue[0];
				}
			}
		}

		$data = '';
		// Conversion du drapeau IPTC en code binaire
		foreach($iptc as $tag => $string)
		{
			$tag = substr($tag, 2);
			$data .= iptc_make_tag(2, $tag, $string);
		}

		// Intégration des données IPTC avec l'image final
		$content = iptcembed($data, $destination_image_final);
	}

	if(!empty($content)) {
		// Dans tout les cas on écrit les informations dans le fichier
		$fp = fopen($destination_image_final, "wb");
		fwrite($fp, $content);
		fclose($fp) ;
	}



Cela fonctionne, néanmoins je pensais que l'option qui fait que la teinte est différente (ISO ?) se trouvait dedans. Raté. Au niveau des EXIFS :



Array
(
    [FileName] => phpiAkY63
    [FileDateTime] => 1480774559
    [FileSize] => 1203747 
    [FileType] => 2
    [MimeType] => image/jpeg
    [SectionsFound] => ANY_TAG, IFD0, THUMBNAIL, EXIF
    [COMPUTED] => Array
        (
            [html] => width="1900" height="1267"
            [Height] => 1267
            [Width] => 1900
            [IsColor] => 1
            [ByteOrderMotorola] => 0
            [Thumbnail.FileType] => 2
            [Thumbnail.MimeType] => image/jpeg
        )

    [XResolution] => 150/1
    [YResolution] => 150/1
    [ResolutionUnit] => 2
    [Software] => Adobe Photoshop Camera Raw 9.1 (Macintosh)
    [DateTime] => 2016:12:02 14:55:46
    [Exif_IFD_Pointer] => 166
    [THUMBNAIL] => Array
        (
            [Compression] => 6
            [XResolution] => 72/1
            [YResolution] => 72/1
            [ResolutionUnit] => 2
            [JPEGInterchangeFormat] => 366
            [JPEGInterchangeFormatLength] => 14558
        )

    [ExifVersion] => 0230
    [DateTimeOriginal] => 2016:10:25 14:54:43
    [DateTimeDigitized] => 2016:10:25 14:54:43
    [SubSecTimeOriginal] => 76
    [SubSecTimeDigitized] => 76
)



(Pas de donnée ISO ?)

Même si on rentre dans le plus complexe, je peux utiliser la librairie PEL pour lire les EXIFS d'une l'image JPG d'origine et les intégrer dans l'image créée.

Néanmoins je veux être sûr qu'il y ai bien dans ce tableau la ou les données qui, leur absence, justifierais que la teinte et les couleurs soit plus ternes. Peut-être ces données (?) :



 [IsColor] => 1
            [ByteOrderMotorola] => 0

// Ou bien 

[XResolution] => 150/1
    [YResolution] => 150/1
    [ResolutionUnit] => 2


??

Je voudrais vraiment savoir quoi récupérer et où pour avoir une image créée similaire à celle d'origine. Je précise donc que les solutions simple comme move_uploaded_file de l'image d'origine n'est pas une solution (je dois redimensionner l'image, la pivoter, mettre un copyright, changer les metas-donnees, créer des miniatures, etc...).

Merci en tout cas pour vos pistes sur le sujet, bonne journée à tous ! Smiley smile
Bonjour,

Wow merci pour l'outil, je ne connaissais pas, c'est bien pratique !

Donc première solution simple :

Demander à mon photographe de bosser en sRGB.

Ensuite, par "convertir" tu sous-entends qu'il est possible de créer l'image avec GD pour ensuite la retravailler avec ImageMagick ? Ou bien ce n'est faisable qu'en recréant l'image avec ImageMagick uniquement ?

Je t'avou que dans un monde toute beau tout propre une fonction du style : $MonImage->formatToSRGB() serait l'idéale !

Ducoup cela remet en cause l'utilisation de GD pour les développeurs étant donné que ImageMagick fait plus en plus simple.

En tout cas, merci à toi, tu m'as apporté un début de solution et le pourquoi du comment.