画像出力に関してはJPEGで画像を用意すれば主要な端末で表示できますが、一部の古い端末はJPEGに対応していませんのでGIF形式やPNG形式で出力する必要があります。
また、変換元の画像に関してもJPEG以外の形式の画像を使用するケースがあるでしょう。
こういった場合に対応するには例えば以下のように画像形式を変換します。
端末が表示可能な画像形式を調べる
今回のサンプルでは画像形式だけを判別できればよいので、GIFしか表示できない端末やPNGしか表示できない端末を配列にしておきます。
そしてユーザーエージェントでこの配列に一致しないか調べて、端末が表示可能な画像形式を決定します。
変換元画像の拡張子を調べる
ファイル名から拡張子を確認します。
pathinfoでファイル名から拡張子だけを抜き出すことができます。
hogehoge.jpg ↓ jpg
ただし、拡張子を偽装したファイルの場合はエラーになりますので、MIMEタイプを確認して画像形式と拡張子が一致しているかを確認します。
MIMEタイプはgetimagesizeで戻り値配列の3番目で取得できます。
list($width, $height, $mimeType) = getimagesize();
戻り値は定数になっているので、image_type_to_mime_typeでMIMEタイプの文字列に直します。
画像の読み込み
元画像の形式が判明したら、以下の関数でファイルを読み込み、イメージIDを取得します。
JPEG→imagecreatefromjpeg
GIF→imagecreatefromgif
PNG→imagecreatefrompng
画像の出力
イメージIDを取得したら、以下の関数で出力したい形式で画像を出力します。
JPEG→imagejpeg
GIF→imagegif
PNG→imagepng
出力前に画像のMIMEタイプをheaderで出力します。
画像データを出力するだけだとただのバイナリデータを表示するだけになりますが、ヘッダを出力することでブラウザが画像として認識します。
JPEG→header(“Content-Type: image/jpeg”);
GIF→header(“Content-Type: image/gif”);
PNG→header(“Content-Type: image/png”);
PHPサンプルソース
以下にPHPでGDライブラリを使用して画像形式を変換する方法を紹介します。
※サーバーにGDライブラリ2.0.28以降がインストールされている必要があります。
<?php
/*
* 画像を携帯端末に適した形式に変換して表示するサンプル
*/
// 画像ファイルパス情報
$imgFile = $_GET['file'];
// ディレクトリ移動制限
if (preg_match('/\.\.|\//', $imgFile)) {
die('Error : Directory cannot contain in file name.');
}
// ファイルの存在チェック
if ((!file_exists($imgFile)) || ($imgFile == '')) {
die('Error : File not exists.');
}
// GIFしか表示できないDoCoMo端末
$docomoGifDevice = array(
'D209i', 'D210i', 'D211i', 'D501i', 'D502i', 'D503i', 'D503iS', 'ER209i',
'F209i', 'F210i', 'F211i', 'F501i', 'F502i', 'F502it', 'F503i', 'F503iS',
'F671i', 'KO209i', 'KO210i', 'N209i', 'N210i', 'N501i', 'N502i', 'N502it',
'N821i', 'NM502i', 'P209i', 'P209iS', 'P210i', 'P501i', 'P502i', 'P503i',
'P651ps', 'P821i', 'R209i', 'R691i', 'SH821i', 'SO210i', 'SO502i',
'SO502iWM', 'SO503i', 'SO503iS',
);
// PNGしか表示できないSoftBank端末
$softbankPngDevice = array(
'J-DN02', 'J-P02', 'J-P03', 'J-SA02', 'J-SH02', 'J-SH03', 'J-T04',
);
$userAgent = $_SERVER['HTTP_USER_AGENT'];
// 標準ではJPEG形式で出力
$outExt = 'jpg';
// ドコモのGIF専用端末であればGIF形式で出力
if (preg_match("/^DoCoMo\/1\.0\//", $userAgent)) {
$explodedUserAgent = explode('/', $userAgent);
if (in_array($explodedUserAgent[2], $docomoGifDevice)) {
$outExt = 'gif';
}
// ソフトバンクのPNG専用端末であればPNG形式で出力
} elseif (preg_match("/^J-PHONE\/2\.0\//", $userAgent)) {
$explodedUserAgent = explode('/', $userAgent);
if (in_array($explodedUserAgent[2], $softbankPngDevice)) {
$outExt = 'png';
}
}
// 拡張子を判別して画像情報を取得
$extention = pathinfo($imgFile, PATHINFO_EXTENSION);
$extention = strtolower($extention);
// 画像ファイルのmimetypeを確認
$imageInfo = getimagesize($imgFile);
$mimeType = image_type_to_mime_type($imageInfo[2]);
switch ($extention) {
case 'jpg' :
case 'jpeg' :
// mimetypeが拡張子と異なる場合はエラー終了
if ($mimeType != 'image/jpeg') {
die('Error : This file is not jpeg file.');
}
$imageID = imagecreatefromjpeg($imgFile);
break;
case 'gif' :
if ($mimeType != 'image/gif') {
die('Error : This file is not gif file.');
}
$imageID = imagecreatefromgif($imgFile);
break;
case 'png' :
if ($mimeType != 'image/png') {
die('Error : This file is not png file.');
}
$imageID = imagecreatefrompng($imgFile);
break;
default ;
die('Error : This file cannot convert.');
break;
}
// ヘッダ情報として出力したい形式のMIME情報を出力
// 出力したい形式で画像情報を出力
switch ($outExt) {
case 'jpg' :
header("Content-Type: image/jpeg");
imagejpeg($imageID);
break;
case 'gif' :
header("Content-Type: image/gif");
imagegif($imageID);
break;
case 'png' :
header("Content-Type: image/png");
imagepng($imageID);
break;
default ;
exit;
break;
}
?>
実行例
実行例はこちらからご確認下さい。
→URLをメールで送る
http://ookura.tanikaze.com/Sample/post450/