iモードで機種判別して表示2

どうしてまたやるの?

前回書いたページより1年が経ってしまいましたが、DoCoMoは209,503,210と次々と新機種が出てしまいました。
私もとうとうP503isを入手し、iモード版の「くまの檻」を確認したところ・・・あれ?モノクロアイコン???
実は何気にマイナーチェンジしてたのですが、それがアダになって新機種は全て501と同じ扱いになってました(汗)

ということで、今回は新機種対応版です。
根本解決ではないので、近日またバージョンアップするかもしれません。

各機種ごとの色数リスト

各機種の画面スペックは以下の表のようになっています。
・・・法則性がありませんね(涙)
ez WebやJ Phoneだと対応色数を環境変数で渡してくれるんですけどねぇ。

機種
画像サイズ
横×縦
色数
画像フォーマット
501iシリーズ
P501i 96×120 モノクロ2色 GIF
N501i 118×128 モノクロ2色 GIF
D501i 96×72 モノクロ2色 GIF
F501i 112×84 モノクロ2色 GIF
502iシリーズ
P502i 96×117 4 GIF(アニメーション)
N502i 118×128 4 GIF(アニメーション)
N502it 118×128 4 GIF(アニメーション)
D502i 96×90 256 GIF(アニメーション,透過)
F502i 96×91 256 GIF(アニメーション,透過)
SO502i 120×120 4 GIF(アニメーション)
SO502iWM 120×113 256 GIF(アニメーション,透過)
NM502i 111×106 モノクロ2色 GIF
209iシリーズ
P209i 96×87 4 GIF(アニメーション)
P209is 96×87 256 GIF(アニメーション,透過)
N209i 108×82 4 GIF(アニメーション)
D209i 96×90 256 GIF(アニメーション,透過)
F209i 96×91 256 GIF(アニメーション,透過)
R209 96×72 4 GIF
KO209i 108×82 256 GIF(アニメーション,透過)
ER209i 120×72 モノクロ2色 GIF
503iシリーズ
P503i 120×130 256 GIF(アニメーション,透過),JPEG
P503is 120×130 256 GIF(アニメーション,透過),JPEG
N503i 118×128 4096 GIF(アニメーション,透過),JPEG
D503i 132×161 4096 GIF(アニメーション,透過)
F503i 96×91 256 GIF(アニメーション,透過)
SO503i 120×113 655336 GIF(アニメーション,透過)
210iシリーズ
P210i 96×91 256 GIF(アニメーション,透過)
N210i 118×113 256 GIF(アニメーション,透過)
D210i 96×91 256 GIF(アニメーション,透過)
F210i 96×113 256 GIF(アニメーション,透過)
KO210i 96×96 256 GIF(アニメーション,透過)
691iシリーズ
R691i 96×72 4 GIF(アニメーション)
821iシリーズ
P821i 118×128 4 GIF(アニメーション)
N821i 118×128 4 GIF(アニメーション)
SH821i 96×78 256 GIF(アニメーション,透過)

Perlソース

前回と同じくユーザーエージェント から機種情報を取得し、表示画像を切り替えます。
今回は法則性が無いので、各機種ごとの色数を連想配列で格納しました。
何気なく、J Phone対応になっているのはご愛嬌です(^^;

#!/usr/local/bin/perl
# i-mode機種判別画像表示CGI

#-----------------------
# 表示画像データ
#-----------------------
# 表示ディレクトリ 
$IMG_DIR = '../pic/';

# 白黒版
$IMG_M = 'kumaoriim.gif';
# カラー版
$IMG_C = 'kumaorii.gif';
# 4色版
$IMG_4 = 'kumaorii4.gif';
# J-Phone版
$IMG_J = 'kumaorij.png';

#===============================#
# メイン
#===============================#
# 機種情報からファイル名取得
&chk_agent($ENV{'HTTP_USER_AGENT'});

# ファイル情報取得
($dev,$ino,$mode,$nlink,$uid,$gif,$rdev,
       $size,$atime,$mtime,$ctime,$blksize,$blocks) = stat($file);

# ファイル読込
open(IN, "$file");
binmode(IN);
sysread(IN, $buf, $size);
close(IN);

# 画像表示
print $ContentImage;
print $buf;

#===============================#
# エージェント情報により画面情報取得
# in:HTTP_USER_AGENT
#===============================#
sub chk_agent(){
    local @AGENT = split(/\//,$_[0]);
    local $color;

    # ユーザーエージェント情報
    %AGENT_INFO = (
        "P501i",2,
        "N501i",2,
        "D501i",2,
        "F501i",2,
        "P502i",4,
        "N502i",4,
        "N502it",4,
        "D502i",256,
        "F502i",256,
        "SO502i",4,
        "SO502iWM",256,
        "NM502i",2,
        "P209i",4,
        "P209is",256,
        "N209i",4,
        "D209i",256,
        "F209i",256,
        "R209",4,
        "KO209i",256,
        "ER209i",2,
        "P503i",256,
        "P503is",256,
        "N503i",4096,
        "D503i",4096,
        "F503i",256,
        "SO503i",655336,
        "P210i",256,
        "N210i",256,
        "D210i",256,
        "F210i",256,
        "KO210i",256,
        "R691i",4,
        "P821i",4,
        "N821i",4,
        "SH821i","256"
    );

    $ContentImage = "Content-type: image/gif\n\n";
    #-----------------------
    # imode判別
    #-----------------------
    if($AGENT[0] eq "DoCoMo"){
        # 色情報取得
        $color = $AGENT_INFO{$AGENT[2]};

        # 色からファイル名設定
        # 未定義時
        if(!defined($color)){
            $file = "$IMG_DIR$IMG_C";
        }
        elsif(256 <= $color){
            $file = "$IMG_DIR$IMG_C";
        }
        elsif(4 <= $color){
            $file = "$IMG_DIR$IMG_4";
        }
        else{
            $file = "$IMG_DIR$IMG_M";
        }
    }
    #-----------------------
    # J-Phone判別
    #-----------------------
    elsif($AGENT[0] eq "J-PHONE"){
        $ContentImage = "Content-type: image/png\n\n";
        $file = "$IMG_DIR$IMG_J";
    }
    #-----------------------
    # その他機種
    #-----------------------
    else{
        $file = "$IMG_DIR$IMG_C";
    }
}

使用方法

参考

iモード対応HTML 画面の文字数

[HOME][実験君]