Symfoware

Symfowareについての考察blog

PHPで画像リサイズ(ImageMagick, GD使用)

PHPで画像のリサイズを行う方法を調べたのでメモしておきます。

環境はDebian 7 + php 5.4.4
縮小する画像はこちらからお借りした9.9 MB、5472x3648のデータです。
Canon EOS 7D Mark II Sample Images & Movies



ImageMagick使用



まず、ImageMagickを使用する方法から。

Install the Imagick PHP extension on Debian
こちらを参考に、必要なライブラリをインストールしておきます。


# apt-get install php5-imagick




1600x1600に収まるように縮小するサンプルはこんな感じになりました。


  1. <?php
  2. // 縦横、1600pxに収まるように縮小したい
  3. $width = 1600;
  4. $height = 1600;
  5. $image = new Imagick('sample.jpg');
  6. // オリジナルのサイズ取得
  7. $width_org = $image->getImageWidth();
  8. $height_org = $image->getImageHeight();
  9. // 縮小比率を計算
  10. $ratio = $width_org / $height_org;
  11. if ($width / $height > $ratio) {
  12.     $width = $height * $ratio;
  13. } else {
  14.     $height = $width / $ratio;
  15. }
  16. // 縮小実行
  17. $image->scaleImage($width, $height);
  18. // 保存
  19. $image->setCompressionQuality(80);
  20. $image->writeImage('result.jpg');
  21. $image->destroy();




# php sample.php




で実行。1.1MBのファイルサイズの画像が生成されました。





GD使用



次にGDを使用する方法を試してみます。

必要なライブラリをインストール。


# apt-get install php5-gd




サンプルプログラムはこんな感じになりました。


  1. <?php
  2. // 縦横、1600pxに収まるように縮小したい
  3. $width = 1600;
  4. $height = 1600;
  5. //JPEGファイルを読み込む
  6. $image = ImageCreateFromJPEG('sample.jpg');
  7. // 元画像のファイルサイズを取得
  8. $original_width = ImageSx($image);
  9. $original_height = ImageSy($image);
  10. //元画像の比率を計算し、高さを設定
  11. $proportion = $original_width / $original_height;
  12. $height = $width / $proportion;
  13.     
  14. //高さが幅より大きい場合は、高さを幅に合わせ、横幅を縮小
  15. if($proportion < 1){
  16.     $height = $width;
  17.     $width = $width * $proportion;
  18. }
  19. $new_image = ImageCreateTrueColor($width, $height); // 画像作成
  20. // 元画像から再サンプリング
  21. ImageCopyResampled($new_image, $image,0,0,0,0,$width,$height,$original_width,$original_height);
  22. // 保存
  23. ImageJpeg( $new_image , 'result.jpg' , 80 );




実行してみると、296.7KBのファイルが出力されます。
ImageMagickで保存すると1.1MBなのに。




ImageMagick + GDの組み合わせ



ImageMagickで保存した時のファイルサイズをなんとか減らせないか調べたのですが、
良い方法が見つかりませんでした。

保存はGDの機能を使用するようにしてみます。


  1. <?php
  2. // 縦横、1600pxに収まるように縮小したい
  3. $width = 1600;
  4. $height = 1600;
  5. $image = new Imagick('sample.jpg');
  6. // オリジナルのサイズ取得
  7. $width_org = $image->getImageWidth();
  8. $height_org = $image->getImageHeight();
  9. // 縮小比率を計算
  10. $ratio = $width_org / $height_org;
  11. if ($width / $height > $ratio) {
  12.     $width = $height * $ratio;
  13. } else {
  14.     $height = $width / $ratio;
  15. }
  16. // 縮小実行
  17. $image->scaleImage($width, $height);
  18. // 保存
  19. //$image->setCompressionQuality(80);
  20. //$image->writeImage('result.jpg');
  21. //$image->destroy();
  22. // GDの機能で保存する
  23. $write_image = ImageCreateFromString($image->getImageBlob());
  24. ImageJpeg($write_image, 'result.jpg', 80);




これで297.9KBのファイルになりました。
関連記事

テーマ:プログラミング - ジャンル:コンピュータ

  1. 2015/01/11(日) 13:39:32|
  2. PHP
  3. | トラックバック:0
  4. | コメント:2
  5. | 編集
<<PHPで画像リサイズの高速化(setOption,libjpeg-turbo使用) | ホーム | apache2 mod_access_tokenをJavaから使用する>>

コメント

GDで保存すると確かに画像出力サイズは小さくなりますが、解像度が低くなるので注意が必要です。
  1. 2016/10/06(木) 15:47:00 |
  2. URL |
  3. fujishiro #-
  4. [ 編集 ]

なるほど。
コメントありがとうございます。
  1. 2016/10/06(木) 22:06:08 |
  2. URL |
  3. symfo #-
  4. [ 編集 ]

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバック URL
http://symfoware.blog68.fc2.com/tb.php/1578-259ef1d4
この記事にトラックバックする(FC2ブログユーザー)