2017-07-20 3 views
1

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:

phpinfo (Imagick section)

+0

S'il vous plaît laissez-moi savoir si vous avez besoin d'informations supplémentaires –

+0

quelle version imagick? – NID

+0

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? –

Répondre

0

Peut être cela vous aidera à:

Imagick::autoLevelImage

Détermine le niveau d'un canal d'image particulière en escaladant les valeurs minimales et maximales à la gamme complète quantique.

Exemple # 1 Imagick :: autoLevelImage()

<?php 
function autoLevelImage($imagePath) { 
    $imagick = new \Imagick(realpath($imagePath)); 
    $imagick->autoLevelImage(); 
    header("Content-Type: image/jpg"); 
    echo $imagick->getImageBlob(); 
} 

?> 
0

Les commandes suivantes fonctionnent très bien pour moi sur ImageMagick 6.9.9.0 Q16 Mac OSX. Comme je l'ai mentionné dans mon commentaire plus tôt, il suffit de convertir la première couche du fichier PSD. Désolé, je ne connais pas bien Imagick. Voici donc la commande ImageMagick équivalente.

convert ART00060111_A.psd[0] -profile USWebUncoated.icc -profile sRGB_v4_ICC_preference.icc ART00060111_A.jpg 

enter image description here

convert ART00060111_B.psd[0] -profile USWebUncoated.icc -profile sRGB_v4_ICC_preference.icc ART00060111_B.jpg 

enter image description here

post-scriptum Il semble que vous essayez d'accéder à la première couche via $ image-> setIteratorIndex (0) ;. Donc, je ne suis pas sûr de savoir pourquoi vous recevez de tels messages. Pouvez-vous essayer mes commandes dans une fenêtre de terminal? Est-ce qu'ils travaillent là? Si non, alors il y a peut-être un bug dans votre version d'ImageMagick.

Aussi, pourquoi dépouiller le jpg des profils via $ image-> stripImage() ;. Pour une meilleure visualisation sur plusieurs plateformes et différents navigateurs, vous obtiendrez un résultat plus cohérent si vous quittez le profil sRGB.

De quel bogue parlez-vous qui vous oblige à démarrer Imagick pour effectuer le redimensionnement?