4 votes

Comment convertir une TIFF CMJN/RGB en JPEG RGB en utilisant PHP IMagick

J'ai une application PHP qui doit traiter des fichiers TIFF entrants. Je n'ai aucun contrôle ni connaissance sur les espaces colorimétriques de ces TIFF et l'application doit stocker toutes les images entrantes en tant que JPEGs RGB.

Le problème, c'est que les fichiers TIFF entrants peuvent être n'importe quoi: CMJN, RVB, une sorte de YCbCr enveloppé dans sRGB, etc., et je dois les convertir en JPEGs RGB avant de les enregistrer.

J'ai besoin d'une fonction de conversion en PHP qui utilise l'extension IMagick et qui peut prendre n'importe quelle donnée binaire TIFF et la convertir en données binaires JPEG RGB correctes. Elle doit traiter correctement les différents espaces colorimétriques à l'intérieur des images TIFF. Le format de sortie (JPEG RGB) reste le même pour n'importe quel fichier d'entrée.

La solution évidente suivante convertit correctement certains TIFF CMYK, certains TIFF CMYK ont des couleurs inversées et les TIFF RVB YCbCr sont totalement corrompus par un recouvrement rouge :

$convertisseur = new IMagick();
$convertisseur->setResourceLimit(6, 1);
$convertisseur->readImageBlob($data);

if ($convertisseur->getImageColorspace() != IMagick::COLORSPACE_RGB
    && $convertisseur->getImageColorspace() != IMagick::COLORSPACE_GRAY
) {
    $icc_rgb = file_get_contents('sRGB_v4_ICC_preference.icc');
    $convertisseur->profileImage('icc', $icc_rgb);
    $convertisseur->setImageColorspace(IMagick::COLORSPACE_RGB);
}

$convertisseur->setImageFormat('jpeg');
$convertisseur->setImageCompression(Imagick::COMPRESSION_JPEG);
$convertisseur->setImageCompressionQuality(60);

$convertisseur->resizeImage(1000, 1000, IMagick::FILTER_LANCZOS, 1, true);
$convertisseur->stripImage();

$resultat = $convertisseur->getImagesBlob();

Cette solution est tirée d'ici : http://blog.rodneyrehm.de/archives/4-CMYK-Images-And-Browsers-And-ImageMagick.html Évidemment, cela ne fonctionne pas pour tous les espaces colorimétriques, car il ne les détecte pas de manière fiable. Comme vous pouvez le voir, il utilise même le profil colorimétrique sRGB_v4 ICC téléchargé depuis sa page d'accueil.

Google me propose une solution particulière au problème du recouvrement rouge (un des problèmes de conversion), mais elle est uniquement pour la console et lorsque vous savez d'avance que vous avez affaire à des images YCbCr :

convert some.tif -set colorspace YCbCr -colorspace RVB some.jpg

Je peux me débrouiller en utilisant passthru pour convert et en passant à convert tous les commutateurs magiques nécessaires, mais je suppose que je dois détecter l'espace colorimétrique de l'image source à l'avance et appeler un identify | grep avant chaque convert dans une application PHP sinon est exagéré.

1voto

D.Mill Points 313

J'ai rencontré ce même problème. Il est également apparu dans les forums imagick et la correction a été intégrée dans ImageMagick 6.8.0-4.

Donc, la mise à jour devrait résoudre ce problème. J'ai passé à ImageMagick 6.8.1-9 et n'ai pas rencontré ce problème depuis.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X