2017-07-20 9 views
1

私はを使用してファイルをjpegファイルに変換するconvertImage()というメソッドを作成しました。Imagickが私のチャンネルを超えるpsdファイルをインポートできないのはなぜですか?

CMYKからRGBに変換するために、ICCのプロファイルを追加しました。

これは、いくつかのファイルを除いて何千ものファイルに対してうまくいきます。PSD

maximum channels exceeded `ART00060111_B.psd' @ error/psd.c/ReadPSDImage/1085 

そして他人のために:

Unable to read the file: ART00060111_A.psd 

あなたがここにファイルを見つけることができます:[ART00060111_A.psd, ART00060111_B.psd, USWebUncoated.icc, sRGB_v4_ICC_preference.icc]ここ

は私phpinfo()あるいくつか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(); 
} 

私はこの例外を得ましたImagickについて:

phpinfo (Imagick section)

+0

追加情報が必要な場合はお知らせください –

+0

imagickバージョン? – NID

+0

最大チャンネル数** ImageMagick **はPSDから読み取ることができますが、画像にはそのチャンネルがありません。あなたのPhotoshopのバージョンと、** ImageMagick **の開発者が読むことができるものとの間には、いくつかの非互換性があるとしか推測できません。PSDフォーマットは良く知られていません。https://stackoverflow.com/a/5355949/2836621失敗した画像には*「レイヤーエフェクト」*があります。これらのエフェクトを持つ画像には影響がありますか?問題を引き起こした? –

答えて

0

これはあなたを助けるかもしれませ:

Imagick::autoLevelImage

これは、完全な量子範囲に最小値と最大値をスケーリングすることにより、特定の画像チャネルのレベルを調整します。

例#1 Imagick ::はautoLevelImage()

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

?> 
0

次のコマンドはImageMagickの6.9.9.0 Q16マックOSX上で私のために正常に動作。以前私のコメントで述べたように、PSDファイルの最初のレイヤーを変換するだけです。申し訳ありませんが、私はよくImagickを知らない。それではImageMagickの同等のコマンドがあります。

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

P.S. $ image-> setIteratorIndex(0);で最初のレイヤーにアクセスしようとしているようです。だから私はなぜあなたがそのようなメッセージを得ているのか分からない。ターミナルウィンドウでコマンドを試すことはできますか?彼らはそこで働いていますか?そうでなければ、ImageMagickのあなたのバージョンにバグがあるかもしれません。

また、なぜ$ image-> stripImage();によってプロファイルのjpgを取り除きますか。最良のクロスプラットフォームとさまざまなブラウザの表示のために、sRGBプロファイルを終了すると、一貫性のある見た目の結果が得られます。

サイズ変更を行うためにImagickを起動しなければならないというバグは何ですか?

関連する問題