ひとりごと

新しい記事:[1233]  古い記事:[1231] 表示単位 :

ついったー[おとなり日記] かがみさん Y.Kumagaiさん

2004/07/13 (火)

・ 圧縮PROXY調整

AirH"電話をそのまま使うと 32k パケット通信がものすごくとろとろでいや~んなので画像を圧縮しているわけですが、ザウルスの仕様である『如何なる画像も縦横それぞれ半分のサイズに縮小表示』と違って、AirH"電話では『画面サイズよりも大きい場合は横幅が画面サイズになるよう縮小表示』となっているみたいですので、横幅が240ドットよりも大きい画像をそのまま圧縮するのは無駄じゃろうということで縮小処理を書き直してみました。

前はシェルスクリプトを使っていましたが、今回はcgiでPHPを呼び出しています。<img src=~> とかで大量に呼び出されることが予想されるのに、PHPみたいな大げさなのを使うとは言語道断・・・なのですが、AirH"の速度ならあんまり問題ないのです(苦笑)

-CFI
#!cfi
Content-Type: image/gif
cgi: /usr/home/takatani/delegate/imgsmall.php
--
Content-Type: image/jpeg
cgi: /usr/home/takatani/delegate/imgsmall.php
--
Content-Type: image/png
cgi: /usr/home/takatani/delegate/imgsmall.php
-imgsmall.php
#!/usr/local/bin/php
<?php

$BINDIR = "/usr/local/bin";
$QUALITY = 35;            // jpeg圧縮品質(数字が小さいほど圧縮率が高い)
$BORDER = 8192;        // これ以下のサイズは圧縮しない

$tmpfname = tempnam ("/tmp", "imgsmall");

$cnvcmd = array(1=>"giftopnm -quiet","jpegtopnm -quiet","pngtopnm -quiet");
$contenttype=array(1=>"image/gif","image/jpeg","image/png");

$fp = fopen("php://stdin","r");
$buf="";
if ($fp>0) {
    while(!feof($fp)) $buf .= fread($fp,4092);
    fclose($fp);
}

$wfp = fopen($tmpfname,"w");
if (false==$wfp) exit;
fwrite($wfp,$buf,strlen($buf));
fclose($wfp);

$sz = getimagesize($tmpfname);

if (strlen($buf)>$BORDER) { // しきい値よりも大きい場合は変換


    if ($sz[1]>240) { // 幅が240より大きいとき
        $smallcmd = "$BINDIR/pnmscale -width 240|";
    } else {
        $smallcmd = "";
    }

    $cnv=$cnvcmd[$sz[2]];
    $buf2 = `$cnv $tmpfname |$smallcmd $BINDIR/cjpeg -quality $QUALITY -baseline -optimize`;

    if (strlen($buf2)>strlen($buf)) $buf2=$buf;
    else                $sz = getimagesize($tmpfname);

} else {
    $buf2=$buf; // しきい値以下の場合はそのまま利用
}

echo "Content-Length: ",strlen($buf2),"\n";
echo "Content-Type: " . $contenttype[$sz[2]] . "\n\n";

echo $buf2;

unlink($tmpfname);

?>

もうすこしスマートにならんのかな~といつも思うのですが、その割にはほとんど何もエラー処理をしていないという手抜きっぷり(^^;)。ザウルスと違って png もちゃんと表示できますから、サイズが小さいものに関してはjpg/png/gif は等価に扱っています(ザウルスでは強制的にgifやjpegに変換しないと表示できなかったので)。

うちの落書きこーなーはだいたい横幅 400~450の大きさが多いのですが、Air"電話による横幅縮小よりも、pnmscale で縮小してから表示したほうが表示される絵は良い感じになります。サイズはもちろん小さくなりますから、強制横幅縮小はつけておくとなかなか便利なようです。

# http://www.google.com/ とかがまともに表示されない不具合は未だ健在(^^;)
# 『PROXYを通さなければ正常に表示される』かつ『他のブラウザでこのPROXYを
# 使っても正常に表示される』なのが謎です

□ 関連記事

[つっこみ]

新しい記事:[1233]  古い記事:[1231] 表示単位 :
※このページへのリンクは自由です。リンクの方法については[つっこみ]で表示されるページの最後をごらんください。
たかたに(takatani@mars.dti.ne.jp)