質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

GD(Graphics Library)

GD(Graphics Library)は、線や多角形、円、テキストなどを書くことができるライブラリです。グラフなどを作成する際に利用されます。

Q&A

解決済

2回答

3045閲覧

PHPで画像のリサイズ

HiroakiYamada

総合スコア8

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

GD(Graphics Library)

GD(Graphics Library)は、線や多角形、円、テキストなどを書くことができるライブラリです。グラフなどを作成する際に利用されます。

0グッド

0クリップ

投稿2017/07/11 08:55

編集2017/07/12 08:49

PHPのGDで画像のリサイズをしているのですが、リサイズ後の画像が縦に伸びたり横に伸びたりで
うまくいきません。
やりたいこととしましては、プロフィール写真は160200で、プライベート写真は250200でリサイズしたいです。
コードはネットで見つけたものを多少修正しています。

以下にコードを記述しますので、どなたかご教授いただければと思います。
よろしくお願いします。

↓呼び出し元

php

1$photo_dir = '../photo/'; 2$photo_dir1 = '../photo_resize/'; 3 4// プロフィール写真 5if (file_exists($photo_dir . $line['member_id'] . ".jpg")) { 6 if (file_exists($photo_dir1 . $line['member_id'] . ".jpg")) { 7 unlink($photo_dir1 . $line['member_id'] . ".jpg"); 8 } 9 $srcPath = $photo_dir . $line['member_id'] . ".jpg"; 10 $dstPath = $photo_dir1 . $line['member_id'] . ".jpg"; 11 makeThumbnail($srcPath, $dstPath, 160, 200); 12} 13 14// プライベート写真 15$photo2_dir = '../photo2/'; 16$photo2_dir1 = '../photo2_resize/'; 17if (file_exists($photo2_dir . $line['member_id'] . "_01.jpg")) { 18 if (file_exists($photo2_dir1 . $line['member_id'] . "_01.jpg")) { 19 unlink($photo2_dir1 . $line['member_id'] . "_01.jpg"); 20 } 21 $srcPath = $photo2_dir . $line['member_id'] . "_01.jpg"; 22 $dstPath = $photo2_dir1 . $line['member_id'] . "_01.jpg"; 23 makeThumbnail($srcPath, $dstPath, 250, 200); 24} 25if (file_exists($photo2_dir . $line['member_id'] . "_02.jpg")) { 26 if (file_exists($photo2_dir1 . $line['member_id'] . "_02.jpg")) { 27 unlink($photo2_dir1 . $line['member_id'] . "_02.jpg"); 28 } 29 $srcPath = $photo2_dir . $line['member_id'] . "_02.jpg"; 30 $dstPath = $photo2_dir1 . $line['member_id'] . "_02.jpg"; 31 makeThumbnail($srcPath, $dstPath, 250, 200); 32} 33if (file_exists($photo2_dir . $line['member_id'] . "_03.jpg")) { 34 if (file_exists($photo2_dir1 . $line['member_id'] . "_03.jpg")) { 35 unlink($photo2_dir1 . $line['member_id'] . "_03.jpg"); 36 } 37 $srcPath = $photo2_dir . $line['member_id'] . "_03.jpg"; 38 $dstPath = $photo2_dir1 . $line['member_id'] . "_03.jpg"; 39 makeThumbnail($srcPath, $dstPath, 250, 200); 40} 41

↓メソッド

php

1/* ---------------------------------------------------------- 2 * 画像のサイズを変形して保存する 3 * ---------------------------------------------------------- */ 4function transformImageSize($srcPath, $dstPath, $width, $height) 5{ 6 list($originalWidth, $originalHeight, $type) = getimagesize($srcPath); 7 switch ($type) { 8 case IMAGETYPE_JPEG: 9 $source = imagecreatefromjpeg($srcPath); 10 break; 11 case IMAGETYPE_PNG: 12 $source = imagecreatefrompng($srcPath); 13 break; 14 case IMAGETYPE_GIF: 15 $source = imagecreatefromgif($srcPath); 16 break; 17 default: 18 throw new RuntimeException("サポートしていない画像形式です: $type"); 19 } 20 21 $canvas = imagecreatetruecolor($width, $height); 22 23 imagecopyresampled($canvas, $source, 0, 0, 0, 0, $width, $height, $originalWidth, $originalHeight); 24 imagejpeg($canvas, $dstPath, 100); 25 imagedestroy($source); 26 imagedestroy($canvas); 27} 28 29 30 /* ---------------------------------------------------------- 31 * 内接サイズを計算する 32 * ---------------------------------------------------------- */ 33 function getContainSize($width, $height, $containerWidth, $containerHeight) 34 { 35 if($containerWidth != 160){ 36 $ratio = $width / $height; 37 $containerRatio = $containerWidth / $containerHeight; 38 if ($ratio > $containerRatio) { 39 return array($containerWidth, intval($containerWidth / $ratio)); 40 } else { 41 return array(intval($containerHeight * $ratio), $containerHeight); 42 } 43 }else { 44 return array($containerWidth, $containerHeight); 45 } 46 //return array($containerWidth, $containerHeight); 47 48 } 49 50 /* ---------------------------------------------------------- 51 * 画像のサムネイルを保存する 52 * ---------------------------------------------------------- */ 53function makeThumbnail($srcPath, $dstPath, $maxWidth, $maxHeight) 54{ 55 list($originalWidth, $originalHeight) = getimagesize($srcPath); 56 if ($maxWidth > $originalWidth && $maxHeight > $originalHeight) { 57 copy($srcPath, $dstPath); 58 return; 59 } 60 61 list($canvasWidth, $canvasHeight) = getContainSize($originalWidth, $originalHeight, $maxWidth, $maxHeight); 62 63 transformImageSize($srcPath, $dstPath, $canvasWidth, $canvasHeight); 64} 65 66

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

自己解決

DmImageという別なライブラリを使って解決しました。

投稿2017/07/13 01:49

HiroakiYamada

総合スコア8

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

元の画像と同じ縦横の比(アスペクト比)を維持するためにはそれなりの計算が必要です。
getContainSizeで計算していますが使い方がいまいち合っていないようです。
また、アスペクト比を維持するにしましてもサムネイルの作成(リサイズ)の方法をどうするか
検討する必要があるかと思います。

最終的なサイズは決定している仕様かと思いますのでその前提で。
要はリサイズする結果をどうするかということです。
getContainSizeをCALLしてサイズを取得しているにも関わらず出来上がりのサイズを
$diffWや$diffHにしています。

まずはアップロードの画像サイズとアスペクト比が同じかどうか確認されたほうがよろしいかと思います。
現状では$diffWや$diffH設定が元画像が正方形ではない場合縦横同じサイズでリサイズされますので
伸びたり縮んだりするかと思います。

但し、現状のgetContainSizeですとアスペクト比が異なるアップロード画像では「スキマ」できるかと思います。
「スキマ」のできない「トリミング」も計算で可能です。

何を基準にリサイズ(またはトリミング)するかということです。
これは仕様の話かと思いますのでご確認下さい。

投稿2017/07/11 15:10

編集2017/07/11 15:14
packet1024

総合スコア342

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

HiroakiYamada

2017/07/12 00:22

ご回答ありがとうございます。 このような書き方にしたのは、プロフィール写真が160*200より小さいときは そのサイズを使用し、同様にプライベート写真が250*200より小さければそのサイズを 使用するためです。 最初はimagecopyresampled($canvas, $source, 0, 0, 0, 0, $width, $height, $originalWidth, $originalHeight);と記述していたのですが、縦横同じ長さの画像をアップすると、160*160に リサイズされてうまくいかなかったためです。
packet1024

2017/07/12 00:59

元画像がリサイズ後のサイズよりも小さければ元画像をそのまま・・ということであれば transformImageSizeの中で$width, $heightと$originalWidth, $originalHeightを比較する必要があると思います。 どちらも小さい場合か、どちらかが小さい場合かなど考える必要はあるかと思います。 また、元画像をそのまま使うのであれば画像処理をせず、copyで処理という手もあります。 // リサイズ後の縦横いずれも元画像の縦横より小さい場合はコピーする if ($width > $originalWidth && $height > $originalHeight) { copy($srcPath, $dstPath); return; } をgetimagesize()の下辺りに入れたらどうでしょうか。
HiroakiYamada

2017/07/12 01:39

上記試してみましたが、規定サイズよりも小さいものはそのまま表示されました。 ありがとうございます。 大きい画像はリサイズしたとき、伸びてしまいうまくいかないのですが、 何か良い方法はございますでしょうか? 上司に相談したところ、「既存のプログラムを修正するのが難しいのであれば、別のライブラリを使うなど工夫して、作業してください。」と言われググっているのですが、同じようなやりかたしか 見つけられませんでした。
packet1024

2017/07/12 06:12

imagecopyresampledの引数、$diffを$originalに変更してもおかしいですか?
HiroakiYamada

2017/07/12 08:51 編集

メソッドの処理を上記のように変更したのですが、変化はなかったです。
packet1024

2017/07/12 10:04

サムネイルの縦横が160, 200の場合getContainSizeで160, 200 を返しておりますので アスペクト比が考慮されていません。 250, 200の場合うまく行っているのであればgetContainSizeの一部をコメントアウトして 確認してみて下さい。 // if($containerWidth != 160){ .. .. // }else { // return array($containerWidth, $containerHeight); // }
HiroakiYamada

2017/07/13 01:48

ご回答ありがとうございます。 別な方法で解決しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問