連載目次へ

レシピ
使用言語:PHP(バージョン4.3.0以降)
 GDモジュールが使用可能なこと

 今回は,フォルダ内にある画像の形式変換とサイズ調整を一気に行うスクリプトを作ってみます。用途としてはデジカメで撮影した画像(通常はJPEG)をケータイの待ち受け用にGIF形式にしてサイズも横幅200ピクセルに統一といったことを想定します。最初からケータイのカメラで撮影すれば…というご指摘は小声ないし心の中でどうぞ。

リスト1●JPEGをGIFに変換するPHPのプログラム(pic_conv.php)
リスト1●JPEGをGIFに変換するPHPのプログラム(pic_conv.php)
[画像のクリックで拡大表示]
図1●四つあったJPEGのファイルが,リスト1のプログラムにより,四つのGIFファイルに変換された
図1●四つあったJPEGのファイルが,リスト1のプログラムにより,四つのGIFファイルに変換された
[画像のクリックで拡大表示]

 私が仕事で作るWebプログラムでは,画像を扱う機会が結構あります。デザイナから受け取る画像はJPEGだったりGIF,PNGであったり形式が定まりません。ケータイ・サイトの開発ではキャリアによって画像がGIFでなくては困るとか,サイズはこの大きさまででないと表示できないといった制約も多く,デザイナでもないのに画像の調整を行うこともしばしばあります。といっても,毎回Photoshopで調整というのも手間ですから,JPEGをGIF形式に一発変換,ついでにサイズ調整もするスクリプトを作ってみました。Web開発はPHPを使うことが多いので,言語はPHPを使います。

作成前の事前準備

 PHPは,Web開発に特化されているだけあって画像操作関係の関数を豊富に持っています。ここでは,GDライブラリというエクステンション(外部拡張機能)モジュールを使用します。php_gd2.dllというのが,PHPで画像処理を行うためのモジュールです。まずはこのGDを使用できるようにしなくてはなりません。

 Windows環境でPHPを導入している場合,Windowsフォルダ(通常はC:\Windows)にあるphp.iniで,550行目近辺の以下の設定を変更してください。

;extension=php_gd2.dll

行頭にある;(セミコロン)をとります。ApacheなどのHTTPサービスとPHPを併用している場合は,ここで一度HTTPサービスの再起動を行っておきます。よくわからないときはWindowsごと再起動してください。再起動しないとphp.iniの変更が有効になりません。

 なおGDは,一時期GIFの特許問題からGIF操作に関する関数を実装から外していた時期があります。古いPHPを使っている場合は,最新版のPHPを導入してGIF操作ができるバージョンに差し替えてください。

GDのimage~系の関数を 多用する

 今回のプログラム(リスト1)は,C:\fooというフォルダの中にある拡張子.jpgのファイルすべて(.JPGは対象外。大文字小文字を区別します)を,縦または横サイズが最大200pxのGIFに変換します。縦横がどちらも200px以下のものはサイズ調整しません。またオリジナルのJPEGは上書きせず,img-0.gifのように通し番号を付けた別ファイルとしてGIFを生成します。プログラムをC:\fooに配置し,コマンドプロンプトを起動して

c:\php\php pic_conv.php

のように実行すると,図1のように複数のファイルを一度に変換できます。

 JPEGはフルカラー画像であり,GIFは256色しか使えないので,単純なコピーはできません。減色という操作が必要になります。そこでGDに実装されている減色関数imagetruecolortopaletteを使います。ディザと呼ばれる処理を行い,減色に伴う不自然な色飛びを調整できます。

 ここでは,フルカラーのJPEGから256色のGIFという最も難しい変換を試しましたが,これがBMPからPNGのようなケースなら,どちらもフルカラーなのでパレット操作などが不要になりずっと簡単に記述できます。

 フォルダ内の大量の画像を一括変換する処理は,画像処理ソフトを使って一つずつ行うよりも,こうしてスクリプトでざざっと一発処理するほうがはるかに楽です。スクリプトを一から書くという行為はたしかに面倒ですが,6時間の苦労でその先1年は楽ができるわけです。

連載の終わりに一言

 いつも完璧で巨大なものだけを構築するのがプログラミングなのではなく,そうした巨大なプロジェクトを陰で支える小さな日用品的スクリプトを書くことだって立派なプログラミングです。これまでの連載で,少しでも皆さんがスクリプトを面白いなと感じていただけたなら,実は「簡単10分」のサンプル作成に毎回8時間かかっていたという,全然簡単でも10分でもなかった事実も報われるかもしれません。言うは易し,生むは難しでございます。ご愛読ありがとうございました。

  (「かんたん10分プログラミング」は,Rev2.0として生まれ変わります。
引き続きご愛読いただければ幸いです)