スレッド表示 | フラット表示〕 全トピック 920 件中 174 番目 次≫ ≪前

画像のリサイズ

created: 2006-10-28 22:54 | modified: 2006-10-29 20:52 | reply: 4

[3438] 画像のリサイズ

user: 江戸川アダモ | created: 2006-10-28 22:54
画像投稿掲示板の続きで、別件の質問です。

先述のアップロードされた画像をリサイズする下記のスクリプトについてですが…

************ php **************************************

if($_FILES['pic']['name']!=""){

//アップロードされた画像の処理/////////////
$fname=$_FILES['pic']['name'];
$temp=$_FILES['pic']['tmp_name'];

$target='/home/public_html/bbs/pic/'.$fname;
move_uploaded_file($temp,$target) or exit("file upload failed");

//画像をリサイズする↓////////////////////
$size=getimagesize($target);
$yx=$size[1]/$size[0];
$sum=imagecreate(200,200*$yx);
$orig=imagecreatefromjpeg($target);//【*1】
imagecopyresampled($sum,$orig,0,0,0,0,200,200*$yx,$size[0],$size[1]);

$file='/home/public_html/bbs/pic/sum/'.$fname;
//サムネイルを保存///////////////////////////
imagejpeg($sum,$file);

imagedestroy($orig);
imagedestroy($sum);

chmod('/home/mctaichi/public_html/bbs/pic/',0707);

}
*******************************************************

ある程度以上のサイズの画像をアップロードしようとすると、下記のようなエラーメッセージが出ます。

Fatal error: Allowed memory size of 8388608 bytes exhausted (tried to allocate 6400 bytes) in /home/public_html/bbs/check.php on line 41

ちなみに、このときアップロードした画像のファイルサイズは679KB、phpのmax_uploaed_sizeは8MBに設定してあります。

line 41というのは上記の【*1】の行です。
このことから察するに、imagecreatefromjpeg関数はjpegファイルを一旦非圧縮の画像に変換していて、それが8MBを超えたということではないでしょうか?

そうだとすると、元が600KB(1600*1200)程度の画像であっても、それに何らかの加工を施そうとすると、途中の段階で巨大なファイルが出来てメモリを食うので、結局エラーになってしまう訳ですよね?
これを回避する方法は無いのでしょうか?
reply: 3439 返信 編集 削除

[3439] アップロードする画像サイズ

user: ゆうじ | created: 2006-10-29 00:00
こんばんわ。

> imagecreatefromjpeg関数はjpegファイルを一旦非圧縮の画像に変換していて、それが8MBを超えたということではないでしょうか?

中身の詳しいことはわかりませんが、
非圧縮だと 1600*1200 は6M弱ありますからね。
デフォルトだと memory_limit = 8M なので
このあたりが限界なんでしょう。

XREAの掲示板で同類のスレッドが立ってました。
http://sb.xrea.com/archive/index.php/t-8285.html
CGI版PHPを併用する手もあるようです。


蛇足ですが、1600*1200 とはけっこう大きめの画像ですね。
私の17インチモニターでは表示できないサイズです。

以下は、Google Analytics で拾ってきた、
あるサイトの訪問者の画面解像度の統計なんですが、
これを見る限り、画像掲示板にアップロードするには
大きすぎるように感じますがいかがでしょう。
1024 x  768  61.64%
1280 x 1024 19.03%
1280 x 800 6.50%
1280 x 768 4.92%
800 x 600 1.63%
1400 x 1050 1.29%
1440 x 900 1.11%
1152 x 864 0.81%
1680 x 1050 0.67%
1280 x 960 0.59%
Parent: 3438  reply: 3440 返信 編集 削除

[3440] 画像ファイルのサイズ

user: 江戸川アダモ | created: 2006-10-29 00:23
ゆうじさん。再びありがとうございます。

リンク先の掲示板を見ても、やはり画像を一旦メモリ上に展開するのでサーバに負担がかかるようですね。
とはいえこのためだけにCGI版を用意するのも面倒ですし、そもそもレンタルサーバなので並立出来るかどうかも判りません。

画像サイズですが、1600*1200サイズといえば最近のデジカメの画素数からすると、2段階くらいサイズを落としたサイズです。
投稿する人がWEBサイト用に縮小してからアップロードしてくれればよいのですが、何も考えずデジカメで撮った画像(多分フルサイズ)をそのままアップロードしてきそうなので対策を考えていたのです。

まあでも、方法が無いのであれば「1024*768以下のサイズにしてからアップロードしてください。」と注釈を付けるか(そんな面倒なことが必要なら投稿しない、となるかも知れませんが)、あるいはサムネイルを作らずにテキストで元画像にリンクを張るやり方しか無いようですね。
Parent: 3439  reply: 3441 返信 編集 削除

[3441] 試してみましたが

user: ゆうじ | created: 2006-10-29 19:07
1600x1200(900KB)の jpegファイルを用意し、
アップロードとサムネイル作成を試してみました。

memory_limit = 8M 、upload_max_filesize = 2M の
サーバでは、やはりimagecreatefromjpeg あたりで強制終了されてしまいます。
CGI版PHPでも、インターナルサーバエラーで実行不可でした。

アップロードとサムネイル作成を別スレッドにすれば
一度に使うメモリーを減らせるかと思い
この2つをファイルを分け、
アップロードしたファイルを保存後
header('Location: ・・・') で
サムネールの処理に飛ばしてみましたが同じく実行不可でした。
スクリプトで対応するのは無理っぽいです。
他に対処方法は考えつきません。

もし、専用サーバを借りるなりして
使えるメモリーを増やしたとしても、
無限にあるわけではないので、
アップロード対象に対して
何らかの制限は設けるべきだと思います。
Parent: 3440  reply: 3442 返信 編集 削除

[3442] 投稿画像サイズの限界

user: 江戸川アダモ | created: 2006-10-29 20:52
わざわざ試していただいてありがとうございます。

CGI版でも無理なんですか。ではますます望みがない…
他の処理と別にしたとしても、imagecreatefromjpegの時に作成される(多分非圧縮の)画像だけで8Mを超えてしまうのでは無いでしょうか。

そういえば、先の投稿でupload_max_filesize = 8Mと書きましたが、2Mの間違いでした。
memory_limitが8M でした。つまりそちらで試された環境と同じです。

この環境で今度は1300*1000くらい(300MB強)の画像のリサイズを試みましたが、リサイズに成功しました。
ですので、1300*1000?1600*1200の間に成否のボーダーラインがあるということですね。

まあ、その位あればモニタで見るには十分なサイズですし、画像が溜まった時のディスクの容量の問題もあるので、投稿サイズの制約を設けるとともに、仮にそれ以上の画像を送ろうとしても受付ないようにします。
Parent: 3441  返信 編集 削除
スレッド表示 | フラット表示〕 全トピック 920 件中 174 番目 次≫ ≪前
ページの一番上へ
Googleグックマークに登録 Yahooグックマークに登録 livedoorクリップに登録 @niftyクリップに登録 はてなブックマークに登録 deliciousに登録 Buzzurlに登録 FC2ブックマークに登録
最近更新された掲示板トピックス
管理人Blog
Yahoo Search

最近更新したNote
PHPマニュアル
今日のブックマーク
PHPマニュアル関数検索
関数名を入力し検索ボタンをクリック↑