
PHPでPhotoShopとIllustratorのファイルをアップロードするページを作成しています。
※アップロードできるファイルは「psd、ai」です。
内部でImageMagickのコマンドを実行してjpgファイルに変換しています。
変換するImageMagickのコマンドは以下のコマンドです。
convert -flatten psdファイル jpgファイル
※jpgファイルは変換後のものです。
psdファイルが200MBを超えると変換に時間がかかっているのか、止まっているのかわからず・・・
※20MB以下のPSDファイルは問題なくjpgに変換できています。
teratermでコマンドラインから上記のコマンドを実行しても同じ結果になってしまします。
ImageMagickでPSDファイルを変換するのをネットで調べても解決できるような記事を見つける事ができませんでした。
※たぶん、私の調べ方に問題があるのかと思っていますが・・・
申し訳ありませんが、皆さんのお知恵を私におかしいただけませんでしょうか。
些細な事でも何でも構いませんので宜しくお願いします。
No.5ベストアンサー
- 回答日時:
とりあえずflattenは使わない方が良いよ。
flattenを抜きにしてレイヤー単位で出力させて
それをまた重ね合わせたらどう?
(どこのレイヤーまで処理が行っているかわかると思うけど)
>teratermでコマンドを実行して変換までいかず、teratermのカーソルが点滅してるだけで・・・
>30分ぐらいまでは実行してみたんですが、途中でCtrl + Cで止めてしまいわかりません。
>参考にならなくてすみません。
PSDって拡張子は変わってないけどフォトショップのバージョン毎に微妙に中身が変わっている。
(aiと違って保存するバージョンが選択はできないけど)
それで変で問題が発生する可能性ってあるのかな?
topコマンドでCPUやメモリの動きを監視してImageMagickが動いているか見てみた方がいいかも
>本題に戻りますが、参考になりそうな質問と回答をStackoverflowで見つけましたので掲載させていただきます。
(「ImageMagick MemoryLeak」で検索したらすぐ見つかったから理不尽な難癖つけられる前にもっと早くやっていればよかったなぁ・・・)
>PHPレベルでのメモリリークならFatalErrorで知ることが出来るのにちょっぴり不便ですね・・・
あのさぁコンソールでImageMagickをやっても問題が起きているって質問者書いているのが見えない人?
回答ありがとうございます。
アドバイスいただいた通り、flattenのオプションをコマンドから抜いて実行してみました。それでconvertコマンドを実行後、teratermでtopコマンドを実行してみたら、一応、convertコマンドが動いている事は確認できました。
レイヤー毎の画像(jpg)が変換されるかと思いましたが変換されずそのままでした。
教えていただいたサイトを参考に下記のコマンドを実行してみたらpsdファイルからjpgファイルに変換する事ができました。
convert psdファイル[0] jpgファイル
本当に助かりました。
ありがとうございました。
では、失礼します。
No.4
- 回答日時:
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のクラスで変換する時は参考にさせていただきます。
では、失礼します。
No.2
- 回答日時:
>> 根本的に私の考え方が間違っていたのでしょうか。
>> 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を実行した際のログは残せたりできるのでしょうか。
申し訳ありませんがもう少し、私にお付き合い下さい。
皆さん、宜しくお願いします。
No.1
- 回答日時:
これで試してみてください。
http://www.kingsquare.nl/phppsdreader/
こちらでも同様に時間がかかるのであれば妥協するしかないですね。
もともと重い処理だと思われるので。
この回答への補足
回答ありがとうございます。
根本的に私の考え方が間違っていたのでしょうか。
PSDファイルをJPGに変換するのにImageMagickを使用しないのでしょうか。
PHPでPSDを画像変換するに、どの方法が一般的なのでしょうか。
せっかくアドバイスいただいたのですが、できればImageMagickで変換したいと考えていますが・・・
無理ならアドバイスいただいた方法を使用するようにプログラムを変更したいと考えます。
どうか、再度ご教授いただけたら幸いです。
申し訳ありませんが宜しくお願いします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
家電製品の電力周波数を変える機械
-
FortranをC++(VC++)へ変換
-
逆コンパイルと逆アセンブルの...
-
.sb3のファイルを.sb2に変換す...
-
VB6で16進のXOR演算
-
VB 6 を VS 2012に変換するには?
-
シーケンサのCPUはニーモニック...
-
UTF8→ShiftJISに変換したいです!
-
ASP.NET SJIS→UTF-8文字コード...
-
C#でのpngからbmpへの変換について
-
10進数をBCDに変換する方法
-
アセンブラ言語の数字を数値に...
-
HRESULTの代替となる型
-
N88BASICのバイナリデータをテ...
-
緯度、経度の 10進法と 60進法...
-
gmtime()とlocaltime()は
-
Macターミナルで実行中のプログ...
-
powershell を使いカレントディ...
-
TCP/IP通信時のサーバーからの受信
-
Windows上で、シグナル(SIGTERM...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
家電製品の電力周波数を変える機械
-
逆コンパイルと逆アセンブルの...
-
エクセルVBAの自動変換機能?
-
10進数をBCDに変換する方法
-
VB6からVB2010への変換について
-
緯度、経度の 10進法と 60進法...
-
分を時間に変換するプログラム
-
C#で漢字→ローマ字を変換
-
なぜ通信には16進数文字列が使...
-
vb.netの型変換について
-
正規表現でルビを小書きに変換...
-
マンセル⇔XYZ,RGB変換式或いは...
-
C#で漢数字をアラビア数字に変...
-
VB6から.NETへアップグレード時...
-
php
-
VB 6 を VS 2012に変換するには?
-
3のつく数字と3の倍数のみを表...
-
C++からCへのソース変換について
-
エクセルのvbaで検索ボタンを作る
-
tex 郵便記号のだしかた
おすすめ情報