PHPで画像ファイルをリサイズやデータ容量の軽減・圧縮をしたい。 | 在宅ネットでコツコツお金を稼ぐ

メモ代わりにカメラで撮影することがあるのですが、 今回、その画像が溜まってしまって、PCのデータ容量を圧迫するようになってしまいました。 これをどうにかしよう、ということで、 今回はプログラムの力を借りてみたいと思います。

画像をリサイズしてデータ容量を圧縮したい

今回、データ容量を圧縮したいのは、 メモ代わりに使っている画像なので、 そんなに画質にこだわりがないものです。 ある程度、メモの中身を確認できたらいいかな、という程度ですが、 画像をリサイズして、容量を少ないしたいという希望です。

調べてみると、いろいろな言語で画像のリサイズはできそうです。 本当は、この間、始めたばかりのPythonでやってみたかったのですが、 Pythonでやる自信がなくて、今回は慣れているPHPでやってみることに。 PHPでリサイズの方法を覚えておけば、 例えば、ホームページに画像をアップする時に、 アイキャッチ画像と呼ばれる小さな画像を自動で作る、なんていうことも できそうですよね。

今回はサーバー上の画像ではなくて、 自分のローカルのPCの中にある画像をリサイズして圧縮してみます。

PHPで画像をリサイズしよう!表示・保存方法もわかる

PHPで画像を処理する場合は、GDというライブラリを使うと良いようです。 上のサイトを参考にして、やってみると、 ちゃんとリサイズできました。

私のPCにはたくさんの画像があったので、 ファイル一覧を取得して、リサイズしてみることに。 できあがったのは、以下の感じです。 エラー処理などはしていないので、 実際に使う方がいらっしゃったら、 エラー処理なども記述してくださいね。



<?php

$yy=1;//処理した画像の枚数を数えます。

//以下でフォルダの中から.JPGファイルを取得します。

foreach(glob('C:\Users\Pictures/{*.JPG}',GLOB_BRACE) as $file){ 


if(is_file($file)){

list($width, $hight) = getimagesize($file); // 元の画像名を指定してサイズを取得

$width_new=$width/1;
$hight_new=$hight/1;

// 以下でサイズを指定して新しい画像のキャンバスを作成します。

$image = imagecreatetruecolor($width_new, $hight_new); 

$baseImage = imagecreatefromjpeg($file); // 元の画像から新しい画像を作る準備


// 以下で画像のコピーと伸縮

imagecopyresampled($image, $baseImage, 0, 0, 0, 0, 
$width_new, $hight_new, $width, $hight);

//以下でファイル名の整理

$DD = mb_strstr($file, 'DSC');

$DD2 = mb_strstr($DD, '.',TRUE);

$kari='C:\Users\Pictures\resize/'.$DD2.'_変換済み'.'.jpg';

//以下で実際にファイルのリサイズ。クオリティは90を指定してみました。

imagejpeg($image, $kari, 90);

imagedestroy($image);

$yy++;//処理した枚数のカウントアップ。

}//if
}//foreach

print $yy."枚の<br>";

print "リサイズした画像を作成しました!<br>";

?>



GDを使うとデータが圧縮できました

今回は、PHPから標準で使えるGDというライブラリでリサイズしてみました。 GDが使えるかどうかは、phpinfo();をやってみて、 GDの項目に「enable」となっていれば、使えるようです。

それで最初、imagejpeg()関数をそのまま実行してみました。 widthを3分の1、2分の1とテストしてみましたが、 widthを変更すると、サイズはかなり削減できますね。

そして、試しにwidthはそのままで実行してみると、 画像の縦横のサイズは同じなのですが、データ容量はかなり縮みました。

imagejpeg()関数のデフォルトのクオリティーは75%になっているようで、 同じサイズのままデータの補正が行われるようです。 ただ、75%ですと、粗さが目立ちました。 メモ代わりのものでしたが、もうちょっと画質を良く仕上げたいと思いました。

ちなみに、 元画像は8.4MBぐらいでした。

imagejpeg()関数のクオリティーを100にしてみると、同じように8.4MB

クオリティーを90にすると、2.7MBで画質もわりと良さそうです。

クオリティー88は2.43MB。

クオリティー85は2.1MB。

クオリティー80では1.75MBですが、メモ代わりのものでしたら、これぐらいの画質でも良いかもしれません。

そして、デフォルトの75にすると、1.5MB。かなり圧縮できますね。

画質を確認しながら、 クオリティーを調整していくと良いと思います。 今回は、クオリティーを90にしておきました。 それでも、データはだいぶ圧縮できました。

途中で出てきたエラー

試行錯誤して作成中に出てきたエラーを忘備録で書いておきます。

Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 16384 bytes) in

こちらは大きい画像を扱う時に、メモリが不足して出るエラーかな、と思います。 php.iniの「memory_limit」を大きな値にしたらエラーを回避できました。

ちなみに、私は凡ミスで違う場所にあるphp.iniを編集していたことがありますが、 一度、phpinfo();で自分のPHPがどこのphp.iniを参照しているかをチェックしてから php.iniを編集しようと心がけています。

Fatal error: Maximum execution time of 30 seconds exceeded in

こちらはPHPではデフォルトで30秒以上のプログラムはエラーになる設定のようです。 ローカルでたくさんの画像を処理する場合は、時間がかかってしまったので、 適宜、長めの時間にしておきます。

Warning: imagecreatefromjpeg(): gd-jpeg: JPEG library reports unrecoverable error:

こちらは原因がわからなかったのですが、 imagecreatefromjpeg()のエラーのようで、ファイル名も一緒に表示されます。 そのファイルをファイルを開いてみると、真っ黒になっているので、 画像ファイルをうまく作成、リサイズが出来なかったようです。 原因がわからなかったので、このエラーが出たファイルは残しておくことに。

今回のまとめ

以上、画像ファイルをリサイズやデータ圧縮についてやってみました。 GDを使うと、画像ファイルの縦横サイズは変えなくても、 容量を減らせるということがわかりました。

ひょっとしたら、C#やPythonでやった方が高画質で、また、高速で処理できるのかもしれませんが、 それは今後の課題としたいと思います。

今回は思ったような画質にするのに、ちょっと苦戦しましたが、 PHPは慣れていることもあって、なんとか目標を達成しました。 PHPももっと詳しくなれたら、と思います。

気づけばプロ並みPHP 改訂版--ゼロから作れる人になる!

新品価格
¥2,970から
(2020/1/9 10:56時点)

AmazonでPHPの教則本を購入して本格的に学ぶ

[商品価格に関しましては、リンクが作成された時点と現時点で情報が変更されている場合がございます。]

独習PHP 第3版 [ 山田祥寛 ]
価格:3520円(税込、送料無料) (2020/1/9時点)


(2020/01/09)

トップページ

その他のコラム

コンテンツ

トップページ