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

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

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

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

CakePHP

CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

解決済

PHPで元画像の画質のまま縮小した画像を作成したい

k_n
k_n

総合スコア10

PHP

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

CakePHP

CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

4回答

0リアクション

0クリップ

4029閲覧

投稿2019/01/07 11:10

編集2019/01/09 12:03

前提・実現したいこと

PHPで元画像の画質を落とさずに画像を縮小し、サムネイルの画像を作成したいです。

発生している問題・エラーメッセージ

色々なページを参考に(https://qiita.com/suin/items/b01eebc05209dba0eb3e 等)以下のコードを書きましたが、最後にアップロードされる画像が元の画像より多少ぼやけた画像となってしまう原因がわからず困っております。

該当のソースコード

以下、ソースコードになります。

PHP

$originalFile = TMP . $userId . DS . $imgName . '.' . $imageExt; // 元画像 list($originalWidth, $originalHeight, $type) = getimagesize($originalFile); switch ($type) { case IMAGETYPE_JPEG: $originalImage = imagecreatefromjpeg($originalFile); break; case IMAGETYPE_GIF: $originalImage = imagecreatefromgif($originalFile); break; case IMAGETYPE_PNG: $originalImage = imagecreatefrompng($originalFile); break; } //small画像のサイズを指定 if (strpos($fileDir, 'comment_files/') === false) { // 縮小のみする場合 if ($originalWidth > 300) { $thumbW = 300; $thumbH = $thumbW / $originalWidth * $originalHeight; } else { $thumbW = $originalWidth; $thumbH = $originalHeight; } $smallImage = imagecreatetruecolor($thumbW, $thumbH); imagesavealpha($smallImage, true); imagecopyresampled($smallImage, $originalImage, 0, 0, 0, 0, $thumbW, $thumbH, $originalWidth, $originalHeight); } else { // 縮小してトリミングする場合 $thumbW = 300; $thumbH = 300; if ($originalWidth > $originalHeight) { $diffW = $originalHeight; $diffH = $originalHeight; } elseif ($originalWidth < $originalHeight) { $diffW = $originalWidth; $diffH = $originalWidth; } elseif ($originalWidth === $originalHeight) { $diffW = $originalWidth; $diffH = $originalHeight; } $smallImage = imagecreatetruecolor($thumbW, $thumbH); imagesavealpha($smallImage, true); imagecopyresampled($smallImage, $originalImage, 0, 0, 0, 0, $thumbW, $thumbH, $diffW, $diffH); } switch ($type) { case IMAGETYPE_JPEG: imagejpeg($smallImage, '_small.' . $imageExt, 100); break; case IMAGETYPE_GIF: imagegif($smallImage, '_small.' . $imageExt); break; case IMAGETYPE_PNG: imagepng($smallImage, '_small.' . $imageExt, 0); break; } // ファイルをアップロード if (!$this->formatUploadDataAndUpload( $imgName . '_small.' . $imageExt, $fileName . '_small', $fileDir )) { return false; }

仕様で縮小してトリミングするパターンと、ただ縮小するパターンとを分けて実装したのですが、どちらで生成した画像もぼやけた画像となってしまいます。

又、調べてimagejpeg、imagepngの第三引数に画像のクオリティを指定できるようだったので100にしてみたのですがぼやけたままでした。ここで指定する前にぼやけてしまう原因があるのかなと思いつつわからないままです。

些細なことでもアドバイスいただけると嬉しく思います。
どうぞよろしくお願いいたします。

追記

皆様ご回答ありがとうございます。
答えになっていなかったらすみません。
最終的にブラウザで横293.91ピクセルの画像表示枠にアップロードした画像を表示予定です。

tabuuさんからのcaseやifの分岐が想定していないコードを実行している可能性もある、とのことで
横300ピクセルの画像で登録してみたところ画質は変わらないようでした。
調べてみて新しくわかったのは、元画像(1098×22000ピクセル)の画像を横300ピクセルに縮小して生成した画像(サムネイル)と元画像を横300ピクセルで指定しブラウザでimageタグで囲い表示し、検証機能で確認した際、縦の長さがそれぞれ6010.93ピクセル(元画像)、6010ピクセル(サムネイル)となっていることに原因があるかもしれないとわかったのですが、round等駆使してみたのですがなぜか小数点が切り捨てられた画像が生成されてしまいます。
↑imagecopyresampled等を通ったときにfloatがintになってしまう過程で小数点が切り捨てられている?

また画像のぼやけ具合ですが
イメージ説明
実際に表示される画像を並べました。左側がぼけてしまうサムネイル、右側が縮小していない元画像になります。

追記の追記

ご回答、アドバイスいただきありがとうございます。
以下新しく確認したことになります。

・縦1000ピクセル程度の画像の同様な画像で横300ピクセルに縮小した場合
->上に添付しました画像と変わらないくらいにぼやけておりました。
・ブラウザではなくペイント等のアプリで表示した場合
->上記のソースを通して生成したサムネイル画像で確認いたしましたがぼやけておりました。
・サムネイル画像の縦と横の比率は元画像と同一か
->上記の1回目の追記とにかよりますが、厳密にいえば生成されたサムネイルの縦幅は6010.928961748634であってほしいのですが、小数点が切り捨てられてしまい縦幅6010となってしまっている為、多少の誤差がございます。

縮小しているのだからしょうがないというご意見が多数あるようで、しょうがないと片づけたい気持ちとなんだかすっきりしない気持ちとで悩ましいです。。

質問が拙くて申し訳ないのですが、何かわかることがあれば助言いただけると幸いです。
よろしくお願いいたします。

以下のような質問にはリアクションをつけましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

リアクションが多い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

tabuu

2019/01/08 01:12

前提として、画質を落とさずに縮小したいとのことですが、画素を間引くので100%維持するのは難しいと思います。どの程度許容されていますでしょうか。 ぼやける程度にもよりますがどの程度ぼやけるのでしょうか?サンプル画像などありますか? また、caseやifの分岐が想定していないコードを実行している可能性もあるので、例えば横500ピクセルのJPEGに固定して、分岐の無い最小限のコードで実行した場合はどのようになるでしょうか?
yohhoy

2019/01/08 08:00

"横293.91の枠" や "縦の長さがそれぞれ6010.93" の単位系と、どのようにその値を確認したのか(確認手段)を明記したほうがよいです。
k_n

2019/01/08 08:09

アドバイスありがとうございます!不慣れですみません。 修正いたしましたm(__)m
tabuu

2019/01/08 23:26 編集

以下ご確認いただけないでしょうか。 ・1000ピクセル程度の同様な画像を300ピクセルに縮小した場合もぼやけるか? ・ブラウザではなくペイント等のアプリで表示した場合もぼやけるか? ・サムネイル画像の縦と横の比率は元画像と同一か?(追記)
tabuu

2019/01/09 23:48

提示のプログラムのファイル名等を修正して手持ちの画像で実行してみましたが、それほどぼやけているという感じはしませんでした。 実行はCentOSのPHP5.3.3、確認はWindows10のフォトです。 オリジナル:2889x3840 (1.75MB) サムネイル縮小のみ:300x398 (34.6KB) サムネイルトリミング:300x300 (28.4KB) オリジナルの画像が大きいとか、アスペクト比が偏っているとか、縮小率が高いとか、 利用しているライブラリでは無理がきているのかもしれませんね。 他の方がおっしゃっているようにimageMagick等を利用してみてはいかがでしょうか。 ※6000px等であれば利用しているモニタの解像度以上の画像サイズと思われます。 他の方のおっしゃる通り二重三重の縮小の結果、ぼやけるのかもしれません。

まだ回答がついていません

会員登録して回答してみよう

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

PHP

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

CakePHP

CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。