J'ai créé une méthode appelée convertImage()
qui utilise Imagick
pour convertir n'importe quel fichier en un fichier jpeg
.Pourquoi Imagick ne peut pas importer mes fichiers psd en me donnant une exception de canaux dépassés?
J'ai ajouté ICC
profils pour faire face à CMYK
à RGB
conversions.
Cela fonctionne bien pour des milliers de fichiers à l'exception de quelques fichiers PSD
.
public static function convertImage($localPath, $destination, $max_width, $max_height)
{
$image = new Imagick();
$image->readImage($localPath);
if(pathinfo($localPath, PATHINFO_EXTENSION) === "psd"){
$image->setIteratorIndex(0);
}
if ($image->getImageColorspace() == Imagick::COLORSPACE_CMYK) {
$profiles = $image->getImageProfiles('*', false);
// we're only interested if ICC profile(s) exist
$has_icc_profile = (array_search('icc', $profiles) !== false);
// if it doesnt have a CMYK ICC profile, we add one
if ($has_icc_profile === false) {
$icc_cmyk = file_get_contents(__DIR__ . '/../icc/USWebUncoated.icc');
$image->profileImage('icc', $icc_cmyk);
unset($icc_cmyk);
}
// then we add an RGB profile
$icc_rgb = file_get_contents(__DIR__ . '/../icc/sRGB_v4_ICC_preference.icc');
$image->profileImage('icc', $icc_rgb);
unset($icc_rgb);
}
$image->stripImage();
$image->setImageFormat('jpg');
$image->setImageCompressionQuality(85);
$image->writeImage($destination);
$image->clear();
$image->destroy();
// we resize files in a second time because of a imagick bug (pictures become black)
$image = new Imagick();
$image->readImage($destination);
$image->scaleImage($max_width, $max_height, true);
$image->writeImage($destination);
$image->clear();
$image->destroy();
}
Pour certains PSD
fichiers J'ai eu cette exception:
maximum channels exceeded `ART00060111_B.psd' @ error/psd.c/ReadPSDImage/1085
Et pour les autres:
Unable to read the file: ART00060111_A.psd
Vous pouvez trouver les fichiers ici: [ART00060111_A.psd, ART00060111_B.psd, USWebUncoated.icc, sRGB_v4_ICC_preference.icc]
Voici mon phpinfo()
concernant Imagick:
S'il vous plaît laissez-moi savoir si vous avez besoin d'informations supplémentaires –
quelle version imagick? – NID
Le nombre maximum de canaux ** ImageMagick ** lus sur un PSD est de 56, mais votre image n'a pas beaucoup de canaux. Je peux seulement deviner qu'il y a une certaine incompatibilité entre votre version de Photoshop et celle que les développeurs ** ImageMagick ** peuvent lire.Le format PSD est notoirement peu documenté https://stackoverflow.com/a/5355949/2836621 Je note que l'image défaillante a * "effets de calque" * - les images qui fonctionnent ont ces effets ou pourraient-ils être ceux qui sont causant le problème? –