dポイントプレゼントキャンペーン実施中!

PHPでPhotoShopとIllustratorのファイルをアップロードするページを作成しています。
※アップロードできるファイルは「psd、ai」です。

内部でImageMagickのコマンドを実行してjpgファイルに変換しています。
変換するImageMagickのコマンドは以下のコマンドです。

convert -flatten psdファイル jpgファイル
※jpgファイルは変換後のものです。

psdファイルが200MBを超えると変換に時間がかかっているのか、止まっているのかわからず・・・
※20MB以下のPSDファイルは問題なくjpgに変換できています。

teratermでコマンドラインから上記のコマンドを実行しても同じ結果になってしまします。

ImageMagickでPSDファイルを変換するのをネットで調べても解決できるような記事を見つける事ができませんでした。
※たぶん、私の調べ方に問題があるのかと思っていますが・・・

申し訳ありませんが、皆さんのお知恵を私におかしいただけませんでしょうか。
些細な事でも何でも構いませんので宜しくお願いします。

A 回答 (4件)

http://paranoid360.blogspot.jp/2011/04/imagemagi …
とりあえずflattenは使わない方が良いよ。
flattenを抜きにしてレイヤー単位で出力させて
それをまた重ね合わせたらどう?
(どこのレイヤーまで処理が行っているかわかると思うけど)

>teratermでコマンドを実行して変換までいかず、teratermのカーソルが点滅してるだけで・・・
>30分ぐらいまでは実行してみたんですが、途中でCtrl + Cで止めてしまいわかりません。
>参考にならなくてすみません。
PSDって拡張子は変わってないけどフォトショップのバージョン毎に微妙に中身が変わっている。
(aiと違って保存するバージョンが選択はできないけど)
それで変で問題が発生する可能性ってあるのかな?
topコマンドでCPUやメモリの動きを監視してImageMagickが動いているか見てみた方がいいかも



>本題に戻りますが、参考になりそうな質問と回答をStackoverflowで見つけましたので掲載させていただきます。
(「ImageMagick MemoryLeak」で検索したらすぐ見つかったから理不尽な難癖つけられる前にもっと早くやっていればよかったなぁ・・・)

>PHPレベルでのメモリリークならFatalErrorで知ることが出来るのにちょっぴり不便ですね・・・
あのさぁコンソールでImageMagickをやっても問題が起きているって質問者書いているのが見えない人?
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

アドバイスいただいた通り、flattenのオプションをコマンドから抜いて実行してみました。それでconvertコマンドを実行後、teratermでtopコマンドを実行してみたら、一応、convertコマンドが動いている事は確認できました。

レイヤー毎の画像(jpg)が変換されるかと思いましたが変換されずそのままでした。

教えていただいたサイトを参考に下記のコマンドを実行してみたらpsdファイルからjpgファイルに変換する事ができました。

convert psdファイル[0] jpgファイル

本当に助かりました。
ありがとうございました。
では、失礼します。

お礼日時:2013/09/29 23:51

30分はいくらなんでも長い気がしますね・・・


動画処理ならともかくそんなに時間のかかる画像処理って・・・

aiファイルのことを忘れていましたが、aiを処理できるようにした関数は見当たらず、今回はそもそもGDで実現するのが目的でもないので、割愛させていただきます。実際のところ私が紹介したimagecreatefrompsdはバイナリファイルをPHPレベルで処理しているだけなので「GDの拡張処理」とは言い難いんですけどね。

本題に戻りますが、参考になりそうな質問と回答をStackoverflowで見つけましたので掲載させていただきます。
(「ImageMagick MemoryLeak」で検索したらすぐ見つかったから理不尽な難癖つけられる前にもっと早くやっていればよかったなぁ・・・)
http://stackoverflow.com/questions/9993085/php-i …

マニュアル - メソッド (参考になるコメントあり)
http://www.php.net/manual/ja/imagick.setresource …
http://php.net/manual/ja/imagick.getresourcelimi …

定数一覧に

imagick::RESOURCETYPE_UNDEFINED (integer)
imagick::RESOURCETYPE_AREA (integer)
imagick::RESOURCETYPE_DISK (integer)
imagick::RESOURCETYPE_FILE (integer)
imagick::RESOURCETYPE_MAP (integer)
imagick::RESOURCETYPE_MEMORY (integer)

とありましたので、

$constants = array(
imagick::RESOURCETYPE_UNDEFINED,
imagick::RESOURCETYPE_AREA,
imagick::RESOURCETYPE_DISK,
imagick::RESOURCETYPE_FILE,
imagick::RESOURCETYPE_MAP,
imagick::RESOURCETYPE_MEMORY,
);
print_r(array_map(array($im, 'getResourceLimit'), $constants));

で上限をとりあえず調べてみてください。

PHPレベルでのメモリリークならFatalErrorで知ることが出来るのにちょっぴり不便ですね・・・

この回答への補足

回答ありがとうございます。

せっかく説明していただいて申し訳ありませんがPHP内ではコマンドを実行して画像を変換しているので・・・

次、コマンドでの変換でなく、ImageMagickのクラスで変換する時は参考にさせていただきます。

では、失礼します。

補足日時:2013/09/29 23:39
    • good
    • 0

>> 根本的に私の考え方が間違っていたのでしょうか。


>> PSDファイルをJPGに変換するのにImageMagickを使用しないのでしょうか。

もちろんいろいろな方法があるでしょう。

>> PHPでPSDを画像変換するに、どの方法が一般的なのでしょうか。

個人的には、ImageMagickがデフォルトでは使えない環境が多い一方、GDならばデフォルトで使える場合がほとんどなので、後者の方が一般的だと思います。

>> せっかくアドバイスいただいたのですが、できればImageMagickで変換したいと考えていますが・・・
>> 無理ならアドバイスいただいた方法を使用するようにプログラムを変更したいと考えます。

今回掲載させていただいた回答は、「psdファイルが200MBを超えると変換に時間がかかっているのか、止まっているのかわからず・・・」というのがImageMagickのせいなのかそうではなく単に処理が重いだけなのか判別するためのものです。
無理にGDを勧めているわけではありません。

この回答への補足

回答が遅くなってすみません。

アドバイスいただいたPHPのクラスをダウンロードして下記のサイトを参考にしてサンプルを作成しました。

http://phpspot.org/blog/archives/2009/06/photosh …

ダウンロードしたファイルを配置してブラウザで実行したらダウンロードしたクラスの内容とワーニングがブラウザに出力されてしまいました。

それでクラス内のコメントを全て削除してブラウザで再度、実行しました。
そしたら実行中のままになって処理されているのか、されてないのかわからない状況で・・・

こっちも200MBを超えるファイルは変換できないのでしょうか。

もしかしたらImageMagickとPHP PSD Readerなどの変換処理できるファイルサイズはきまっているのでしょうか。

またImageMagickとPHP PSD Readerを実行した際のログは残せたりできるのでしょうか。

申し訳ありませんがもう少し、私にお付き合い下さい。
皆さん、宜しくお願いします。

補足日時:2013/09/27 22:03
    • good
    • 0

これで試してみてください。


http://www.kingsquare.nl/phppsdreader/

こちらでも同様に時間がかかるのであれば妥協するしかないですね。
もともと重い処理だと思われるので。

この回答への補足

回答ありがとうございます。

根本的に私の考え方が間違っていたのでしょうか。
PSDファイルをJPGに変換するのにImageMagickを使用しないのでしょうか。
PHPでPSDを画像変換するに、どの方法が一般的なのでしょうか。

せっかくアドバイスいただいたのですが、できればImageMagickで変換したいと考えていますが・・・

無理ならアドバイスいただいた方法を使用するようにプログラムを変更したいと考えます。

どうか、再度ご教授いただけたら幸いです。
申し訳ありませんが宜しくお願いします。

補足日時:2013/09/27 02:20
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!