- ベストアンサー
PHPファイルアップロードの縮小方法(比率)
- PHP初心者の方がファイルのアップロード時に画像を指定範囲に表示するために、縮小する方法について試行錯誤されています。
- 参考サイトで提案されている関数を使って、画像の比率を変えずに縮小することができます。
- ただし、定義した関数がうまく動作していないためにうまく結びつけられない状況にあるようです。助けていただけると幸いです。
- みんなの回答 (7)
- 専門家の回答
質問者が選んだベストアンサー
> どうしても中途半端に縮小されたり、$new_width、, $new_heightで > 指定した範囲に幅も高さも目一杯に表示され比率が崩れてしまうよう~ GD機能していると思いますよ。機能していなければ上記のような減少にもならないので。 結構細かく修正入っているので、注意してくださいね。 #4で指摘されているように、メモリ開放は足してあげてください。 <?php function getImgSize($path, $new_width, $new_height) { $size = array(); list ($getWidth,$getHeight) = getimagesize($path); $w = $new_height / $getHeight * $getWidth; $h = $new_width / $getWidth * $getHeight; //幅と高さの両方が指定より小さい場合 if ($getWidth <= $new_width && $getHeight <= $new_height) { $size['new_width'] = (int)$getWidth; $size['new_height'] = (int)$getHeight; //幅が指定より大きい場合 } else if ($w >= $new_width && $h < $new_height) { $size['new_width'] = (int)$new_width; $size['new_height'] = (int)$h; //高さが指定より大きい場合 } else if ($w < $new_width && $h >= $new_height) { $size['new_width'] = (int)$w; $size['new_height'] = (int)$new_height; } return $size; } if (isset($_POST['index_submit'])) { $type = $_FILES['upfile1']['type']; //このIF文、機能しない環境があるかも。Windows IEの場合 //その場合file_infoに置き換えて判別する。 if ($type == 'image/jpeg' || $type == 'image/gif' || $type == 'image/png') { $ext = str_replace('image/', '', $_FILES['upfile1']['type']); $path = 'image.'.$ext; move_uploaded_file($_FILES['upfile1']['tmp_name'], $path); $new_width = 200; $new_height = 200; if ($type == 'image/jpeg') { $image = imagecreatefromjpeg ($path); } else if ($type == 'image/gif') { $image = imagecreatefromgif ($path); } else if ($type == 'image/png') { $image = imagecreatefrompng ($path); } //以下3行追加 $size = getImgSize($path, $new_width, $new_height); $getWidth = $size['new_width'] ."<br />"; $getHeight = $size['new_height'] ."<br />"; list($w,$h) = getimagesize($path); $w . '<br />'; $h . '<br />'; $new_image = imagecreatetruecolor($getWidth, $getHeight); imagecopyresampled($new_image,$image, 0,0,0,0,$getWidth,$getHeight, $w,$h ); imagejpeg($new_image, $path, 100); echo "<img src='".$path."' />"; } else { var_dump ('error'); } } ?>
その他の回答 (6)
- mikemike7
- ベストアンサー率87% (97/111)
PHP Manual載せて放棄したと思ったら後だしじゃんけんですか(笑 今気づいたけど、ファイルタイプを判別してる割には、 imagejpeg ($new_image, $path, 100); ってjpg限定で出力してるんだよねえ gif、png、jpgの場合があるなら、 判定して出力方法を変えてあげたほうがいいね。 やり方はNo5さんが教えてくれるんじゃないかなw
お礼
こちらもご指摘ありがとうございます。 おっしゃる通りでその後調べて自己解決する事ができました。 ありがとうございました。
- kosukejlampnet
- ベストアンサー率44% (126/282)
投稿してから気づきましたが、 デバッグ用に書いた’<br />’とか消してくださいね。
お礼
補足説明ありがとうございました。
- mikemike7
- ベストアンサー率87% (97/111)
そこまで書くならちゃんと教えてあげればいいのに。 サイズ指定が間違っているだけなんじゃないかな。 list ($getWidth,$getHeight) = getimagesize ($path); の下に $size['getWidth'] = $getWidth; $size['getHeight'] = $getHeight; を追加 No1での記載 //以下3行追加 $size = getImgSize($path, $new_width, $new_height); $getWidth = $size['new_width']; $getHeight = $size['new_height']; imagecopyresampled ($new_image,$image, 0,0,0,0,$new_width,$new_height, $getWidth,$getHeight ); を追加しているなら、以下に変更 $size = getImgSize($path, $new_width, $new_height); imagecopyresampled ($new_image,$image, 0,0,0,0,$size['new_width'],$size['new_height'], $size['getWidth'],$size['getHeight'] ); 追加していないなら、上記の以下に変更としている箇所を imagecopyresampled ($new_image,$image, 0,0,0,0,$new_width,$new_height, $getWidth,$getHeight と置き換えて下さい。 ここで画像の比率がおかしいのなら、 getImgSize()でのサイズ補正が正しくないんじゃないかなと思います。 処理が終わったらメモリー解放もしましょうね。 imagedestroy($image); imagedestroy($new_image);
お礼
お返事ありがとうございます。 ご指摘の通り試してみましたら 自分の意図していたものを実装することができました。 わざわざコードも書いていただき、とてもとても感謝しています。 ベストアンサーがお一人にしかつける事ができないのでとても残念な気持ちです。申し訳ありません。 これからもっと勉強していきたいと思います。 この度は本当にありがとうございました。
- okbakabaka
- ベストアンサー率30% (22/73)
#2の人が書いているimagecopyresampled()関数もだけど http://php.net/manual/ja/book.image.php 一通りGDについて調べないのは何故? 挙動が変なら聞く前にそれぞれの関数の動きについてくらい調べなさい。
お礼
ご回答ありがとうございます。 ご指摘の通りです。自分でもっと調べる力をつけなければと 反省しております。 今後はもっと勉強してからご利用させていただきます。
- kosukejlampnet
- ベストアンサー率44% (126/282)
補足) imagecopyresampled関数の用法を確認していただければ、修正できると思いますよ。 http://php.net/manual/ja/function.imagecopyresampled.php
お礼
早急なお返事にも関わらず遅くなり申し訳ありませんでした。 ご指摘部分を再度見直してみたのですが、状況が改善されず、 imagecopyresampledのdst_x, dst_y, src_x, src_yを見ていて自分の 質問内容に誤りがあったのに気づきました。 先日の追加質問で 「指定したサイズに右上端から切り取られた形で表示されてしまいます。」 と表記したのですが左端の間違いでした。 お手数おかけして大変申し訳ありませんでした。 その後 getImgSize 関数がおかしいのでは?と 幅と高さの両方が指定より大きい場合も検討し追記してみたのですが どうしても中途半端に縮小されたり、$new_width、, $new_heightで 指定した範囲に幅も高さも目一杯に表示され比率が崩れてしまうような状態で 悩んでおりました。 先ほど#3の方にご指摘いただき気づいたのですが、GDはMACを 使っている自分にとっては導入が難しそうだったので、GDを使わずに..... と考えていたのですが、既にGD関数を使っていたのでしょうか? PHPのマニュアルには「GDおよびImage関数」と記入してあったので てっきりGDを導入しなくても機能するのかと思っていました。 それが原因でうまくできていないだけなら大変お恥ずかしいです。 何度も初心者すぎる質問ばかりで申し訳ありません。
- kosukejlampnet
- ベストアンサー率44% (126/282)
$getWidth,$getHeightが何の脈絡もなく使われていますね。 //以下3行追加 $size = getImgSize($path, $new_width, $new_height); $getWidth = $size['new_width']; $getHeight = $size['new_height']; imagecopyresampled ($new_image,$image, 0,0,0,0,$new_width,$new_height, $getWidth,$getHeight );
お礼
早急なお返事ありがとうございます。 大変感謝しております。 早速ご指摘のとおり三行追加してみたところ ようやく関数が機能しました。 なるほどなととても納得しております。 再度質問となってしまい恐縮なのですが ようやく画像が表示されたのですが、うまく縮小されずに $new_width = 200; $new_height = 200; で指定したサイズに右上端から切り取られた形で表示されてしまいます。 どのような原因が考えられますでしょうか? 失礼かとは思いますが、もし宜しければご教示いただければ幸いです。
お礼
幾度に渡りご指導大変ありがとうございました。 見事に意図するものを実装することができました。 意味不明な質問が多かったと思いますが、 今後は少しづつでも自分で解決していけるように 努力したいと思います。 今回は大変勉強になりました。 本当にありがとうございました。