- ベストアンサー
PHPの画像処理関数
PHPの imagecopyresized() 関数を使って、デジタルカメラで撮影した写真のサムネイルを作ろうとしています。 2000 x 1500 ドットぐらいの大きさまでは出来るのですが、高解像度のものは「元の画像が大きすぎて処理できない」旨のエラーメッセージが出てきます。 この関数で処理できる解像度を引き上げる方法はないものでしょうか? 詳しい方、どうぞ宜しくご教授お願いいたします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
$high=imagesy($img); $wide=imagesx($img); echo "source size=".$wide."x".$high."<br>"; と、サイズを表示するようにした状態で、実行してみたのですが。 Philippines-beach-rocks-sea_3840x2160.jpgは7111x4000の巨大画像(リサイズで捏造) ---------- C:\xampp\htdocs\tools\samples -------- ---- file size= --- Philippines-beach-rocks-sea_3840x2160.jpg -- jpg ++++++ C:\xampp\htdocs\tools\samples\Philippines-beach-rocks-sea_3840x2160.png +++ source size=7111x4000 横7000ドットを超えても正しく動作しましたよ。。 ってことは、こっちと質問者さんの、PHP.INIの記載の違いが原因となります。 こちらの設定では、こうなってます。 memory_limit=128M post_max_size=32M upload_max_filesize=32M 各値の意味は、以下で見れます。 https://www.php-factory.net/trivia/05.php 今回大事なのは、「memory_limit」こいつのみです。 >upload_max_filesize=100Mにしても、200Mにしても全く同じメッセージが出ます。割り当てられたメモリー容量も同じです。 以前このように、補足がありましたが、 今回「アップロードには無関係」なので、原因は、 ✖:upload_max_filesize 〇:memory_limit ってことではないかと、思われます。 128M程度で7000x4000ドットのリサイズは正しく動作しております。 (質問的には、4000x3000xフルカラーですから、実質倍以上のサイズで動作を確認OKです) ディレクトリ構成: ./samples/ 画像を数個入れる。 ./hogehoge.php 貼ってもらったPHPソース にて、動作しましたので、これで解決かな! どうでしょうか? 返答をお待ちしてます。
その他の回答 (3)
- AsarKingChang
- ベストアンサー率46% (3467/7474)
あ~XAMPPなのね。 今ちょっと、外なので、検証できないのですが。 画像はこっちで、用意するので、 ソース貼っておいてもらえます? (PHPはこちらもわかるので、エラーが出る前後だけでOKです) あと、しばらく、このスレッド開けておいてください。 (解決とかにしないでって意味で) 解決するべくやりましょ!
お礼
本当に有難うございます。 とても心強いです。 下にソースコードをコピーします。 <?php //JPGファイルをPNGファイルに変換 // final picture size $finalX=1000; $finalY=750; $folder="samples"; $rpath=realpath($folder); echo "---------- $rpath --------</br>"; $dirHandle=opendir($rpath); while($pic=readdir($dirHandle)){ if($pic=="." || $pic==".."){ continue; } echo "---- file size= ".filesize(realpath($pic))."---</br>"; $ext=substr($pic,strpos($pic,'.')+1); echo "$pic -- $ext</br>"; if(strtolower($ext)=="jpg"){ $img=imagecreatefromjpeg($rpath.'\\'.$pic); }else if(strtolower($ext)=="png"){ $img=imagecreatefrompng($rpath.'\\'.$pic); }else continue; $newPath=$rpath.'\\'.substr($pic,0,strlen($pic)-3)."png"; echo "++++++ $newPath +++</br>"; $high=imagesy($img); $wide=imagesx($img); $copy=imagecreatetruecolor($finalX, $finalY); $col=imagecolorallocate($copy,255,0,0); // ================= エラーが出るライン============= imagecopyresized($copy, $img, 0,0,0,0,$finalX,$finalY, $wide,$high); imagepng($copy, $newPath); imagedestroy($img); imagecolordeallocate($copy, $col); imagedestroy($copy); } closedir($dirHandle); ?>
- AsarKingChang
- ベストアンサー率46% (3467/7474)
「2.321kバイト」 つまり2.3Mだから大丈夫という意味だったとは思いますが。 それは、画像のサイズではなく、ファイルサイズですよ。 それを解凍したらどうなるか?ってことです。 「フルカラー4000x3000px」 単純計算4x3=12M。しかし1画素は「フルカラー」なので、 RGBで3要素=36M必要です。 問題はここから、それは読み出しのみで使う容量で 書き出すときは、編集用のメモリが別途必要なので、さらに倍は 見たほうがいいです。 なので、32Mはとても、小さい値だったということです。 PHPが足りなかったメモリ33554432 さらに元々のファイルを読みだすのに使ったメモリ 解凍後の画素メモリ(4000x3000x3)を計算すると 36000000-33554432=2445568 これをキロバイトにするため1024で割る 2388.25K ほとんど、もともとのファイルサイズになってませんか? ってこと。
お礼
詳しい説明、有難うございます。 今まであまり気にしたこともない画像ファイルに必要なメモリーサイズや、PHPが関数を実行するときのメモリー管理の様子が手に取るようにわかりました。 勉強不足を痛感しました。 php.iniファイルでのupload_max_filesize=70Mぐらいにしてやってみます。
補足
何度もお邪魔して申し訳ありません。 upload_max_filesize=100Mにしても、200Mにしても全く同じメッセージが出ます。割り当てられたメモリー容量も同じです。 php.ini ファイルを更新した後必ずPCをリスタートさせ、XAMPPを起動させているのですが。 変更が反映されていないようです。どこが問題なのでしょうか?何度もご迷惑をおかけしますが、何かアドバイスを頂けると有難いです。
- AsarKingChang
- ベストアンサー率46% (3467/7474)
https://teratail.com/questions/16190 そのまま検索して、そのものずばりが 引っ掛かりましたよ。
お礼
早速にご回答を頂き、有難うございます。 ご指摘のサイトに行って得た情報では、PHPのiniファイルを更新することで高解像度の画像に対応できると思ったのですが、iniファイルで許可されている最大のサイズはupload_max_filesize = 32Mとあり、わたしが縮小しようとしているオリジナル画像(フルカラー4000x3000px)はたったの2.321kバイトなので十分に範囲内なのですがどうしても以下のようなエラーメッセージが出て先へ進めません。 Fatal error: Allowed memory size of 33554432 bytes exhausted (tried to allocate 16000 bytes) ファイルエクスプローラーに表示されているサイズ2.321kバイトというのは何なのでしょうか? そしてこの画像をimagecopyresized()関数でリサイズするにはinitファイルの値をどれくらいにすればよいのでしょうか?また別の質問になってしまうのかもしれませんが、ご存知でしたら教えてください。
お礼
全くご指摘の通り、memory_limit の問題でした。 この値を128Mにしましたら、4000x3000pxの画像を1000x700pxに縮小できました。 今回色々と自分の知らなかったことを勉強させていただきました。 徹底的にお付き合いいただき、本当に有難うございました。