[RESOLU] Imagick, je colle l'image et les couleurs s'inversent, comment remédier ?

Avatar du membre
Mammouth du PHP | 1564 Messages

26 mai 2023, 19:23

Ya je pense que l'image a un profile qui fout la pagaille.

J'ai un système d'ajout d'image, l'utilisateur ajoute son image > j'appose un watermark en bas à droite.

Aujourd'hui, un utilisateur a proposé une image avec un profile qui fait que le collage "image/watermark" inverse les couleurs de l'image proposée (couleur rose et bleu au lieu du vert et jaune, voir exemple ci-joint).

Image

J'ai aucune connaissance en image.

Je cherche évidement à ce que l'image de l’utilisateur reste à son état d'origine.

Mon code :
$fichier = __DIR__ . '/image.jpg';

$im = new Imagick($fichier);
$watermark = new Imagick(__DIR__ . '/watermark.png');

//largeur et hauteur de l'image actuelle
$largeur_image = $im->getImageWidth();
$hauteur_image = $im->getImageHeight();

//Supprime de l'image tous les profiles et les commentaires
$im->stripImage();

//On ajoute le watermark

//nouvelles dimensions
$largeur_image = $im->getImageWidth();
$hauteur_image = $im->getImageHeight();


//nouvelle image de la taille de l'image actuelle plus une hauteur supplémentaire pour mettre le filigrane en dessous de l'image
$nouvelle_image = new Imagick();


$nouvelle_image->newImage($largeur_image, $hauteur_image + 20, new ImagickPixel('white'));

$nouvelle_image->setImageFormat($im->getImageFormat());

//on colle l'image dans la nouvelle image
$nouvelle_image->compositeImage($im, Imagick::COMPOSITE_DEFAULT, 0, 0);


//on colle le filigrane en bas à droite -270 px (la largeur du watermark)
$nouvelle_image->compositeImage($watermark, Imagick::COMPOSITE_DEFAULT, $largeur_image - 270, $hauteur_image + 1);


header("Content-Type: image/jpg");
echo $nouvelle_image;
//$nouvelle_image->writeImage($fichier);

Avatar du membre
Mammouth du PHP | 1564 Messages

26 mai 2023, 19:40

J'ai trouvé la solution, j'ai ajouté ce code

//ajouté après $im = new Imagick($fichier);

if($im->getImageColorspace() == Imagick::COLORSPACE_CMYK){

	$profiles = $im->getImageProfiles('*', false);

	// nous ne sommes intéressés que si le(s) profil(s) de la CCI existe(nt)
	$has_icc_profile = array_search('icc', $profiles) !== false;

	// s'il n'a pas de profil ICC CMYK, nous en ajoutons un
	if($has_icc_profile === false){

		$icc_cmyk = file_get_contents(__DIR__ . '/CGATS001Compat-v2-micro.icc');
		$im->profileImage('icc', $icc_cmyk);

		unset($icc_cmyk);
	} 

	// puis nous ajoutons un profil RVB
	$icc_rgb = file_get_contents(__DIR__ . '/sRGB-v4.icc');

	$im->profileImage('icc', $icc_rgb);

	unset($icc_rgb);

}
Les profiles icc sont téléchargeable ici pour ceux qui le souhaite.