ここでは、GIF画像/JPEG画像/PNG画像相互間の変換を行なうPerlスクリプトしらぎくイメージライブラリの実際の応用例として、PNG画像に対応しない古いブラウザに対してPNG画像をGIF画像に変換して配信する機能について解説しております。
当サイトでこのシステムを実験的に稼動しておりましたが、平成17年12月20日限りで実験を終了し、このページでの見本を除く当サイト内のPNG画像も全てGIF画像に戻しました。
以下の記述は導入時点でのものです。現在では上記の通りこのページ以外ではシステムは発動されません。
WWWサーヴァにしらぎくイメージライブラリを用いて作ったPNG画像からGIF画像への変換CGI設置して、.htaccess設定ファイルでPNG画像に対応しないウェブブラウザがPNG画像をリクエストしてきた場合は変換CGIの呼出しに読み替える事で、自動的にPNG画像をGIF画像に変換して配信出来るようにします。
この方法を用いる事で、PNG非対応環境を本当の意味で気にする必要無くPNG画像をサイトに利用する事が可能になります。
ここでは、当サイトで実験的に用いた方法を解説させて頂きます。
このページで紹介する事は、傍目に見れば面倒な事をしていると思われるかも知れません。
何でこんな面倒な真似をしてまでPNG画像を導入する意味があるのかと思われるでしょう。
確かに、ユニシス社の特許問題も解消された今日では、無理してPNG画像にする必然性もありません。
しかし、PNG画像にはGIF画像と較べて、以下のような利点があります。
制作者が調べたところ、インデックスドカラーでは殆どの場合でGIF画像よりPNG画像の方が小さくなりました。
場合によっては二割以上の削減もありました。
勿論、逆にPNG画像の方が却って重くなってしまう場合もあり得ない事ではありませんが、そのようなケースは八色以上のインデックスドカラーでは殆どありません。
サーヴァの転送量の問題やより早いページ表示の可能性を考えると、リソースは少しでも小さくしたいもので、PNG画像形式はそのような需要に向いていると言えます。
この点は制作者にとっては全くと言って良いほど利点を感じません。
なぜなら、フルカラーが必要なら画質を気にしなければJPEG画像の方が小さくなって良いからです。
特に有名なのはアルファチャネル(インデックスドカラーの場合はパレット透過度)でしょう。
この機能はGIF画像にはありません。
また、ガンマ値指定なども、対応している環境には有利な機能です。
しかしながら、PNG画像を導入すると以下の問題が生じます。
勿論、端数を四捨五入すれば現在では100%の実装率と言えます。
しかしながら、制作者は例え 1%に遙か及ばなくても、そのような環境でアクセスされている事実を考慮すると、どうしてもそのような環境を見限る事が出来なかったのです。
これはツールの問題ですが、実際PNG画像を作るとGIF画像より重くなってしまったり、インターネットエクスプローラなどで開けないものが出来てしまったりします。
制作者はそう言うツールを使っていました。
そこで、GIF画像を別の信頼出来るツールでPNG画像に変換するというやり方を採りました。
特に、前者は制作者にとっては絶対に看過出来ない問題でした。
纏めますと、制作者は
このため、PNG画像形式への転向を永らく控えていました。
しかしながら、今回しらぎくイメージライブラリを用いた画像変換機能をサーヴァに実装する事が出来るようになり、或いは実装出来る環境を手に入れられた事に依り、PNG非対応環境を本当の意味で気にせずにPNG画像の利用をはかれるようになったのです。
以上の機能、すなわち
機能を実現するには、以下のようになります。
これだけでしたら、<img>要素のsrc属性に判定CGIのアドレスを書くだけでいい話です。
ただ、それでは余りスマートではありません(この辺には人によって考え方の違いがあるかも知れませんが)。
制作者がいいと思った方法は、<img>要素のsrcには静的なPNG画像のアドレスを記述するものの、PNG画像非対応環境がHTTPでPNG画像を要求した場合に限り、変換CGIを起動して変換すると言う方法です。
これには「.htaccess」設定ファイルで上記の処理を行うように設定する事で実現します。
更に、この際にリダイレクトせずに内部でCGIを起動させる事も可能です。
今回はこの方法に沿ったPNG画像処理方法を解説します。
以上の機能を実現するシステムの構築に必要なサーヴァ環境は以下のようになります。
WWWサーヴァには以下の条件を満たしている事が必要です。
また、以下の条件を満たしている事が望ましいです。
「PNG画像からGIF画像への変換CGI」は、制作者の発想が込められているものなので、人によっては異なったものになるかも知れません。
今回はしらぎくイメージライブラリのうち、「config.pl」「png2gif.pl」「readPNG.pl」「putPNG.pl」及び「Deflate.pl」だけを抜き取って組込みます。
#!/usr/bin/perl #パラメータの読込。$addr=$ENV{'QUERY_STRING'};
$addr=~s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/ego;
$addr=~s/[<>\|]//g;
$addr=~s/\.\.\///g;
#外部参照は拒否する。if ($ENV{'HTTP_REFERER'} ne '' && !($ENV{'HTTP_REFERER'}=~/
サイトのドメイン\//)) {
print "status: 403 Forbidden\n\nERROR!";
exit;
}
#PNG対応環境には配信しない。if ($ENV{'HTTP_ACCEPT'}=~/image\/png/i || ($ENV{'HTTP_USER_AGENT'}=~/MSIE (\d+)/ && $1>4) || $ENV{'HTTP_USER_AGENT'}=~/Sleipnir/) {
print "location: http://
サイトのドメイン/$addr\n\n";
exit;
}
#PNG画像以外は処理しない。if (!($addr=~/\.png\Z/i)) {
print "location: http://
サイトのドメイン/$addr\n\n";
exit;
}
#実際の変換処理。require './png2gif.pl';
$i=&img::png2gif($addr);
binmode(STDOUT);
print "content-type: image/gif\ncontent-length: ".length($i)."\n\n".$i;
exit;
#!/usr/bin/perl
」はPerlへのパスです。必要に応じて修正して下さい。サイトのドメインは、実際に設置するサイトのドメインを指定します。このとき、一番目ではドメイン中に出てくる「
.
」の前に「\
」を付ける事を忘れないで下さい。このスクリプトでは、対応環境が呼出してきた場合には、当該リソースを直接表示させるようにしております。
制作者の場合、mod_rewriteが組込まれていたため、これを利用する事で、非対応環境でもURLが変わらないようにしました。
以下の記述をルートディレクトリの「.htaccess」に記述します。
RewriteEngine on
RewriteCond %{REQUEST_URI} !\?
RewriteCond %{REQUEST_URI} \.PNG$ [NC]
RewriteCond %{HTTP_ACCEPT} !image\/png [NC]
RewriteCond %{HTTP_USER_AGENT} !MSIE\s[56789]\.
RewriteCond %{HTTP_USER_AGENT} !Sleipnir
RewriteRule (.*) http://
CGI設置URL?$1 [L]
CGI設置URLは、実際にCGIを設置したURLを記述します。
この方法をご覧になると分ると思いますが、インターネットエクスプローラを利用したブラウザで、ユーザエージェント文字列を閲覧者が変更した場合、GIF画像に変換される事になります。
Mozilla/2.0
」または「Mozilla/3.0
」を名乗っている事から、これらの文字列と「Mozilla/4.0[012345]
」だけをチェックする方法もありでしょう。但し、この場合はCGIの方も書き直しが必要となります。また、mod_rewrite関連の記述は下位ディレクトリには継承されないとの事ですが、制作者の環境では「.htaccess」が無いディレクトリやあってもmode_rewrite関連の記述をしていない場合は継承されているようです。
実際には画像に関してのみこの処理が必要なので、画像を置いているディレクトリに同様の記述をした「.htacess」ファイルを置けばいいでしょう(この場合設定記述の最後の行の「?
」以降にディレクトリ名を書き足す必要があります。詳細はここでは割愛させて頂きますが、以下に一例を挙げておきましょう)。
RewriteRule (.*) http://
CGI設置URL?Nihongo/$1 [L]
冒頭でも申し上げた通り、制作者のシステムではこれを更に改良したものを用いております。
具体的には、フルカラーPNG画像の場合はやはりJPEG画像に置換えた方が良いと判断した場合には、代わりのJPEG画像を用意していれば変換しない代わりにそれを配信すると言う機能を搭載しております(現状では実際に使ってはいませんが)。
PNG画像を実際に表示させると、以下のようにPNG画像対応・非対応のどちらの環境でも表示される事が分ります。
PNG画像形式は、かつてユニシス社がGIF画像形式の基幹技術に関して特許権を行使してきた事を受けて、特許に縛られない規格として策定されました。
このような事情から、WWWではかなり熱心な、いや熱心を通り越して狂信的なPNG画像強要活動が散見されました。
しかし、制作者は彼らが展開する余りに強引且つ独善的で気持ち悪い主張を見て、却ってPNG画像(と言うよりPNG画像への切替を強要する連中)にこれ以上無い反感を覚えたものです。
そんなソフトウェアを使っていても特許料を請求されるというのは気に入らないGIF画像形式をやめさせるための卑劣な恫喝以外の何物でもありません。
加えて、制作者は後方互換性を出来得る限り維持する主義であり、この点でもPNG画像への転換を受容れる事が出来ませんでした。
PNG非対応環境なんか考えるなとまで言っており、そんな連中の言う事は絶対に聞けませんでした。
現在ではユニシス社の特許が失効した事で、このような過激な活動は過去のものとなった事、及びGIF画像を自由に扱えるようになって今回のシステムが完成したため、PNG画像導入を試験的に導入したものです。
言ってみれば、ユニシス社がGIF画像基幹技術の特許権を失ったからこそPNG画像を導入出来たとさえ言えます。
結果は良好でしたが、PNG画像の準備に手間が掛かる事と、今後もアンチPNGでい続けようと思わせる事があった事から実験終了と共にこのページのPNG画像以外は全てGIF画像に戻しました。今後はPNG画像を利用する事はもはや無いでしょう。
尚、当サイトのバナーなど、制作者が配布しているGIF画像に関しては、PNG画像への変換を当然ながら禁止しません。
PNG画像を配布している者の中に、GIF画像への変換を禁止する
と言っている者を見た事がありますが、制作者はそんな馬鹿な事は絶対に申しません。