<IMG>タグ一つでカウンタにつかうJPGファイルを何桁も表示するには?

[上に] [前に] [次に]
Leo 1999/12/04(土) 22:27:56
こんばんわ。
カウンタ−をつくろうと思っています。
そのテスト段階として、JPGファイルを2つ表示しようとしました。
内容は次のようです。

-----test.html----
<IMG SRC=http://********/test.cgi>

---test.cgi---
#!/usr/local/bin/perl
print qq(Content-type: image/jpg\n\n);
binmode STDOUT;

open(IMG, "image/5.jpg");
binmode IMG;
print while(<IMG>);
close(IMG);

open(IMG, "image/4.jpg");
binmode IMG;
print while(<IMG>);
close(IMG);

exit;
#EOF

これで、DCと表示させるつもりが、Dと表示されるだけです。
関連するものがないかと探しましたが、
とほほさんのgifcut.plというものがあるらしいのですが、
どこにあるのか分からないのと、jpgでもいいのだろうか?
そういえばどうして皆さんはGIFを使っているんだろうか?
という新たな疑問も生まれたので質問させて頂きました。
よろしくお願いします。

Leo 1999/12/04(土) 22:30:20
申し遅れましたが、できれば自分で学んでいきたいので、
どこがおかしいとか、どうするといいとか教えてほしいです。

ゼロ 1999/12/05(日) 00:25:41
>そういえばどうして皆さんはGIFを使っているんだろうか?
単にGIFの方がサイズが小さかったから。

BF 1999/12/05(日) 03:13:35
どうもはじめまして。
<IMG>タグ一つで複数の画像を表示するには、画像の連結処理が必要かと。
私も過去にチャレンジした事がありますが、これはとても面倒です。
多分、まだスクリプトでビットマップを生成し、出力するタイプの方が
楽でしょう(単に私の技量&知識不足なだけかも・・・)。

初歩的なカウンタの例としては、画像を表示させたい数だけ<IMG>タグを
使って表示させます。
上記のスクリプト(test.cgi)で「54」と表示させるのなら、画像
ファイルのオープン部分に
if ($ENV{'QUERY_STRING'} == 1) { #$ENV{'QUERY_STRING'}が1なら「5.jpg」
    open(IMG, "image/5.jpg");
} elsif ($ENV{'QUERY_STRING'} == 2) { #$ENV{'QUERY_STRING'}が2なら「4.jpg」
    open(IMG, "image/4.jpg");
}
binmode IMG;
print while(<IMG>);
close(IMG);
と言った条件(どんな方法でも構いません)を付け加えてやり、後は
「<img src="test.cgi?1"><img src="test.cgi?2">」の様に
<IMG>タグを2つ記述すれば「54」と表示されます。
もちろんこれはCGIを2度起動する事になりますから、桁が増えれば
その分サーバの負荷も大きくなります。

ですが、とほほさんの作成された「gifcat.pl」や「Fly」等の画像連結
処理が可能な物を使用すれば、このような面倒な処理も必要ありませんし、
起動も一度だけ(<IMG>タグ一つ)で済みます。
(実は私も過去にgifcat.plが目的でここに訪れたのがきっかけ)

とほほさんのGIFファイル連結ライブラリ「gifcat.pl」は
こちら→ http://www.tohoho-web.com/cgi-bin/gifcat.txt

後、これはご質問の内容とあまり関係ありませんが、jpg(jpeg)ファイルの
MIMEタイプは「image/jpeg」ですので注意してくださいね。
print qq(Content-type: image/jpg\n\n);
ではなく
print qq(Content-type: image/jpeg\n\n);
です。
それではまた。

ふじ 1999/12/05(日) 04:01:34
>初歩的なカウンタの例としては、画像を表示させたい数だけ<IMG>タグを
>使って表示させます。

>「<img src="test.cgi?1"><img src="test.cgi?2">」の様に
ところでどうやって、その img タグをHTMLに埋め込みますか?

CGI や SSI で HTML を出力するなら直接
<img src="1.gif"><img src="2.gif">
を出力した方がいいですよね。

BF 1999/12/05(日) 10:35:45
>ところでどうやって、その img タグをHTMLに埋め込みますか?
これは、ただ普通の(CGI等が出力する物等では無い)HTMLに、画像を
貼り付けるのと同じ方法でIMGタグを記述するだけですが?
上記のtest.cgiは結果的に画像ファイルと扱いは同じになりますので。

>CGI や SSI で HTML を出力するなら直接
><img src="1.gif"><img src="2.gif">
>を出力した方がいいですよね。
CGIで出力されるHTMLにカウンタを表示したり、SSIを使ってカウンタを
作るのであれば確かにその通りですね。
でもSSIが利用できない場合には、カウンタだけの為にわざわざフレームを
作成する必要等がでますし、他にもサーバの設定を変更する方法もあるかも
しれませんが、いずれにしてもあまり実用的ではないのではないでしょうか。
ましてやCGIの使えないサーバにホームページがあったとして、CGIのカウンタ
のみを別サーバで動作させるのであれば、フレーム以外でならJava等の何か
プログラム的なものをページに別途加える必要もでてくるかと思います。
その点の利用面に関しては、IMGタグ起動型のCGIカウンタは手軽ですし便利です。

なんか長々と理屈っぽい事を書いてしまってすみません・・・。

ho- 1999/12/05(日) 11:02:19
>そういえばどうして皆さんはGIFを使っているんだろうか?

もひとつ。
ここで他の画像フォーマットについてよーく勉強したほうがいいです。

http://www.bekkoame.ne.jp/~firefly/gform.html

それに、JPEGなんかより今はPNGというスバラシイものがあります。
まぁ対応ブラウザはまだ少ないですけど。

http://www.zdnet.co.jp/macweek/9611/gw1119_png.html

ふじ 1999/12/05(日) 16:24:11
> これは、ただ普通の(CGI等が出力する物等では無い)HTMLに、画像を
> 貼り付けるのと同じ方法でIMGタグを記述するだけですが?
いつも同じ数字が出ますよね? 引数が 1 と 2 なら、「54」という。
そういうのは「カウンタ」ではない、と思うのですが。
# 何か私勘違いしてるのか...


その方法でアクセスカウンタを実現するには、
(数字の各桁毎に別プロセスで CGI が起動するわけなので)
各桁のプロセスが共有できるカウンタの数字を用意しないと。

1. アクセスがあったら、IP、UA等を利用して相手を特定。

   * 一時ファイルに自分のと思われるカウンタの数字があれば
     自分の桁の数字を読み、その数字の画像を出力。

   * 一時ファイルに自分のと思われるカウンタの数字が無ければ
     (つまり、各桁からそれぞれ起動された CGI の中で最初に
     起動された)、カウンタアップして、一時ファイルにその数字
     (と IP と UA)を保存。

2. 適当なタイミングで一時ファイルを消す。

てな風に仕組みを作れば、
<img src="test.cgi?1"><img src="test.cgi?2">
でカウンタができるかも。
引数は「桁」を指定するために使うとして。

# 実用的かどうかは別。6桁のカウンタ起動するのに
# 6個別プロセスが走るのは、ちょっと。

ふじ 1999/12/05(日) 16:58:44
元質問者の方の最初のコードで、画像ファイルを2つ順番に
標準出力に書き出したのに、なぜ最初の一つしか表示されないか、
の理由は、おそらく JPEG のフォーマットのせいかと。

JPEG のフォーマットでは、「ここで画像は終りだよ」という
記号が埋め込まれていますので、一つ目の画像のそれを見付けた
ブラウザが、そこで画像が終りだとして処理を打ち切っているのでは。

http://funada11.denshi.numazu-ct.ac.jp/ichikawa/gazo/graphicfile/format/jpeg/jpeg2.html

Leo 1999/12/05(日) 19:21:38
たくさんの意見をいただきました。有り難うございました。

>BFさん
gifcat.plの在処をおしえて頂いて有り難うございます。
BFさんのいうとうり、思ったよりも大変そうです。
gifcat.plもなかなかながいので、じっくり解読していきたいと思います。
print qq(Content-type: image/jpeg\n\n);
この間違いも大変勉強になりました!

>ho-さん、ふじさん
有益な情報有り難うございます!
画像のフォ−マットについて勉強が必要だということを悟りました。

>ふじさん
どうしてうまくいかなかったのはこれでやっとナットクできました!
ということは、、、
画像の連結とは、"ここで画像は終わり"っていうのを削除して
くっつけるってことなのかな? 違っているかもしれませんが、
雰囲気がつかめました。

とりあえずカウンタ−がほしいので、とほほさんのを試してみたいと思います。うまくいかなかったら、<IMG>タグを桁ごとに送っていうアイデアをもらおうと思います。表示したいサ−バ−がCGIがだめなので、
<IMG>タグでしか、表示できそうにないものですから・・・(^−^;;
まだまだ勉強が足りないなぁ・・・(T-T)

みなさん貴重な意見有り難うございました!

うそっち 1999/12/05(日) 20:42:02
>画像の連結とは、"ここで画像は終わり"っていうのを削除して
>くっつけるってことなのかな?

その「フッタ」とは別にパレットの情報などが入った「ヘッダ」もあります。
論理的には複数のJPEGからヘッダとフッタを取り除いて連結して、それにGIF形式のヘッダとフッタをつけてGIFにしてしまうことも可能だと思いますが・・・(あんまし自信なし)。

むっちー 1999/12/05(日) 21:10:12
>論理的には複数のJPEGからヘッダとフッタを取り除いて連結して、
>それにGIF形式のヘッダとフッタをつけてGIFにしてしまうことも
>可能だと思いますが・・・(あんまし自信なし)。
私も自信があるわけではないけれど・・・。
それはちょっと無理なんでないかい。ヘッダは取り替えられてもデータ本体のフォーマットが違うし (*)。しかもJPEGって圧縮方法が特別だから(ってどう特別なのかは答えられない私)、2つのイメージを単純に足してもダメだと思うんです。圧縮率も変わってしまうし。
(*)ヘッダを取り替えてもWORD形式は一太郎形式にはならないですよね。

うそっち 1999/12/05(日) 22:21:57
>それはちょっと無理なんでないかい。
>ヘッダは取り替えられてもデータ本体のフォーマットが違うし 。

ヘッダとフッタを取り除いたらビットマップですから多少の違いはあっても事前に8ビットカラーにしておいたものならJPEG→GIFの形式変更は割と簡単ではないかな?と考えました。
でもよく考えてみたらJPEGに減色保存はないですネ(苦笑)。
BMPを連結→GIF形式に変更ならできるはずですよ。

BF 1999/12/05(日) 23:04:42
>いつも同じ数字が出ますよね? 引数が 1 と 2 なら、「54」という。
>そういうのは「カウンタ」ではない、と思うのですが。
># 何か私勘違いしてるのか...
いえ、ふじさんのおっしゃる通りですよ。
私はLeoさんの書かれた”カウンタを作る事を前提としたテスト段階のスクリプト”に
対して返信させて頂いただけですので。

私の書いた方法を使ってカウンタを作成するのは、さほど難しい事ではありません。
記録は普通のカウンタと同様、一つのファイルにカウント数を記録。
これを一文字ずつ分解する等で桁の判断は可能ですので、引数はふじさんの書かれて
おられる通りで桁数表示のためだけに与える事になります。

次にカウントアップの方法ですが、カウントアップさせるのは一桁目の表示の際のみにし、
あとの残りの桁はただ画像表示をさせるだけの処理にする。
こんな感じでしょうか。

># 実用的かどうかは別。6桁のカウンタ起動するのに
># 6個別プロセスが走るのは、ちょっと。
これは同感です。人気のあるサイトになればなおさらですね。
ですが、少なくとも私がカウンタを作成していた時代?には、私には画像連結の
知識&技術はおろか(今でもか・・)、とほほさんのgifcat.plの様な便利な
ライブラリもありませんでした(探せなかっただけかな・・)。

それに、当時はこの方式のカウンタも結構色々なサイトで見かけましたし。
と言うよりも、今でもちょくちょく見かけますね。
今現在CGI配布系のサイト等で、この様な方式のカウンタを配布されておられるサイトも
ありますから。

[上に] [前に] [次に]