CGI-BBS > CGI > Perl > バイナリーデーター(JpegとGIFだけ)の取得方法について


カレッヂ
カレッヂ


質問者 BlueLaboratory  投稿日 3/8(木) 13:56:43
どうしてもバイナリーデータのしくみと取得の方法が解らないのですが、どうやって取得すればいいのでしょうか?
色々なHPのスクリプトを見させてもらってのですが、全く解らないのです(T_T)
特にデータの取得はどうやってするのかが解らないんです。

ちなみに手持ちの本は
Perlで作るCGI入門
CGI/Perlハンドブック
CGI基礎講座
CGI&Perlポケットリファレンス
CGIプログラミング
だれでもカンタンCGI&SSIサンプル集
があります。って結構買ったな…

今解っている事はバイナリーデータをファイルに読み書きする時はbinmode
ファイルサイズは -s で
と言う事だけなんです(T_T)
横幅と縦幅はどうやって…
回答者 羊相談員  [削除]  投稿日 3/9(金) 10:03:40
JPEGやGIFがどのようなデータ構造になっているのか知りたいということでしょうか?
ただ、GIFは特許の関係で下手に触ると違法となります。
(上手く扱えば問題はありません)
回答者 まさ  [削除]  投稿日 3/13(火) 16:09:38

画像のサイズはImageMagickで取得できます。

$image  = Image::Magick->new;
$image->Read($filename);           # 対象ファイルを読む
$width  = $image->Get('columns');  # イメージ幅
$height = $image->Get('height');   # イメージ高さ

下記ImageMagickのサイトからダウンロードしてインストール
して下さい。
またImageMagickのアーカイブの中にあるPerlMagickもインストール
する必要があります。

http://www.simplesystems.org/ImageMagick/

日本語の簡単な使い方のサイトです。
よろしければご覧になってください。

http://members.tripod.co.jp/futora/perlmagick/

回答者 羊相談員  [削除]  投稿日 3/13(火) 16:36:02
http://www.minc.ne.jp/~yonead/gif/toko0020.htm#step01
http://tools.geocities.co.jp/SiliconValley-SanJose/2089/@geoboard/
http://www.geocities.co.jp/SiliconValley/3453/gif_info/index_jp.html
http://plaza27.mbn.or.jp/~inetwada/jpegFAQ1.htm
http://www.excite.co.jp/search.gw?target=category&search=GIF&look=excite_jp&lang=jp

いろい探してみました。
回答者 羊相談員  [削除]  投稿日 3/13(火) 17:02:11
http://www.minc.ne.jp/~yonead/gif/toko0020.htm#step10
http://www.rescue.ne.jp/study/pack/

どうも6バイト目〜9バイト目あたりに
画像サイズが記憶されているようです。
(一番最初を0バイト目としています)
回答者 まさ  [削除]  投稿日 3/13(火) 17:53:59
ImageMagickはルートの権限がなければインストールできませんね。
管理者にお願いするしかないです。

それよりも画像をJPEGに固定するならば、上記のスクリプトをそのまま利用するのが
いいのでは?

わたしが試した結果、上手くサイズを取得できましたよ。
試したスクリプトは以下です。

----------------------------------------------------------------
#!/usr/local/bin/perl

$ImgFile="foo.jpg";
$MaxW = 10000;
$MaxH = 10000;

($W, $H) = &JpegSize($ImgFile);

if ($W > $MaxW || $H > $MaxH) {

            $W2 = $MaxW / $W;
            $H2 = $MaxH / $H;

            if ($W2 < $H2) { $key = $W2; }
            else { $key = $H2; }

            $W = int ($W * $key) || 1;
            $H = int ($H * $key) || 1;
}

print "Content-type: text/html\n\n";
print "W = $W   H=$H\n";
exit;

sub JpegSize {
         local($jpeg) = @_;
         local($t, $m, $c, $l, $W, $H);

         open(JPEG, "$jpeg") || return (0,0);
         binmode JPEG;
         read(JPEG, $t, 2);
         while (1) {
                 read(JPEG, $t, 4);
                 ($m, $c, $l) = unpack("a a n", $t);

                 if ($m ne "\xFF") { $W = $H = 0; last; }
                 elsif ((ord($c) >= 0xC0) && (ord($c) <= 0xC3)) {
                         read(JPEG, $t, 5);
                         ($H, $W) = unpack("xnn", $t);
                         last;
                 }
                 else {
                         read(JPEG, $t, ($l - 2));
                 }
         }
         close(JPEG);
         return ($W, $H);
}
------------------------------------------------------

ここで$MaxWと$MaxHの値が画像サイズよりも小さいとおかしな結果になるので
大きめに取らないとダメです。

ちなみに結果は
W = 218 H=283
と表示されました。
もちろん正解です。
環境はWin95+Apache1.3.12+ActivePerl522です。

JPEGだけならこれでいいのでは?
しかしこれはなかなか面白いスクリプトですね。

回答者 まさ  [削除]  投稿日 3/13(火) 17:59:51
ちょっと補足ですが結果が(1,1)になっているとのことですがそれは
$MaxWと$MaxHの値を設定していないためです。
きちんと設定すれば動きます。

質問者 BlueLaboratory  [削除]  投稿日 3/13(火) 18:11:01
まささんありがとうございます(T_T)
原因はまささんの言う通り変数で指定するところが間違ってました(^_^;)

ありがとうございましたm(__)m

このページは終了したので返信(回答)は書きこめません

Web裏技