電子書籍の厳選無料作品が豊富!

URL指定で画像サイズの取得が出来ません。
何方かご教授お願いします。
悲しいことにレンタルサーバーにはimage::magickがインストールされていないので使えません。

----perl----
#!/usr/bin/perl
$FileName = "http://i.yimg.jp/images/main11.gif";
( $format, $width, $height ) = &GetImageSize( $FileName );
print "Content-type: text/html\n\n";
print <<"HTML";
<META http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
<BR>
$width x $height <br>
<IMG src="$FileName" border="0">
HTML
sub GetImageSize{
my ( $IMG, $in ) = @_;
my ( %SHT, %LNG );
my ( $buf, $mark, $type, $f_size, $width, $height );
my ( $TAG, $TYPE, $COUNT, $V_OFFSET, $PK, $ENTRY, $Exif_IFD );
my ( $endian, $dummy1, $dummy2, $dummy, $EOI, $APP1, $length, $exif );
my ( $format, $offset, $line, $CODE, $jfif );
my @TGA;
my $ntag;

# 定数
$mark = pack("C", 0xff);
%SHT = ( 'II' => 'v', 'MM' => 'n' );
%LNG = ( 'II' => 'V', 'MM' => 'N' );

# 初期値
$endian = '';
$width = -1;
$height = -1;
$format = '';
$Exif_IFD = -1;

if( $in eq '' ){
$in = 'IMG';
}

open( $in, $IMG ) || return( '', -1, -1 );

binmode($in);
seek( $in, 0, 0 );
read( $in, $buf, 6 );

# GIF 形式
if($buf =~ /^GIF/i){
$format = 'GIF';
read( $in, $buf, 2 );
$width = unpack("v*", $buf);
read( $in, $buf, 2);
$height = unpack("v*", $buf);
}



close( $in );
return( $format, $width, $height );
}
exit;

A 回答 (5件)

LWPが使えるのなら・・



use LWP::Simple;
$content = get("http://i.yimg.jp/images/main11.gif");

という記述で、$content に取り込めると思います。

この回答への補足

k_o_r_o_c_h_a_nさん、回答ありがとうございます。
とりあえず思い通りのことが出来ましたが、ちょっと困ったことがあります。
登録型ランキングサイトのバナーの判定に使いたかったのですが、直リン対策してるサーバからでも画像の
サイズを表示してしまうんです。
画像が直リン禁止しているかの判定って出来ないのでしょうか。
それと同時にアクセスがあった時、この方法でOKでしょうか? ご教授よろしくお願いします。

#!/usr/bin/perl
use Jcode;
use Image::Size;
use LWP::Simple;
use Fcntl ':flock';
read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});

@pairs = split(/&/, $buffer);
foreach $pair (@pairs) {
($name, $value) = split(/=/, $pair);
$value =~ tr/+/ /;
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
Jcode'convert(\$value,'sjis');
$FORM{$name} = $value;
}
$pic_url = $FORM{'url'};
$content = get("$pic_url");
$file = "./get_pic";
open(FH, ">$file");
flock(FH, LOCK_EX);
print FH $content;
flock(FH, LOCK_NB);
close(FH);

($x,$y)=imgsize($file);

print "Content-type: text/html\n\n";
print "$pic_url<br>\n";
if($x){print "幅$x x 長さ$y <br><img src=\"$pic_url\">";}
else{print "画像のURLが間違っています\n";}
____________________________________

レンタルサーバ屋さん、Image::Magicインストールしてくれました。

補足日時:2005/04/14 11:56
    • good
    • 0

>それと同時にアクセスがあった時、この方法でOKでしょうか?



固定のファイルをワークにしているので、同時アクセスは問題があるでしょう。
LOCK制御したところで、WAITする訳じゃないし...

image::sizeのソースを読む限り、in-memoryで勝負できるんじゃないかな。

$pic_url = $FORM{'url'};
$content = get("$pic_url");
($x,$y)=imgsize(\$content);

と言うカンジで。

直リン云々の部分は、何をどう判定したいのか、わかりません。
というか、そもそも何をしようとしているのか良く理解できてません。
    • good
    • 0
この回答へのお礼

k_o_r_o_c_h_a_nさん、回答ありがとうございます。
imgsizeの書式は
($x,$y)=imgsize($content);###誤
    ↓
($x,$y)=imgsize(\$content);###正
だったんですね。一度ファイルに落とさないとダメだと思ってました。

直リンの方は.htaccessで下記の様な記述をして外部から画像への直リンを禁止しているかを判定させたかったのです。こっちは運用の方で何とかしたいと思いますのでとりあえず締め切らせていただきます
ありがとうございました。

_____.htaccess________
SetEnvIf REFERER "i.yimg.jp/" Lilith1
Order Deny,Allow
Deny from all
Allow from env=Lilith

お礼日時:2005/04/16 14:31

LWPのサンプルコードはすでに書かれてますね。


これでLWPモジュールがあれば解決かと思います。

別解として、コマンドを使ってもいいですね。
以下はwgetを使う方法です。

system("wget http://i.yimg.jp/images/main11.gif");

この回答への補足

angbandさん、回答ありがとうございます。
system("wget http://i.yimg.jp/images/main11.gif");
ネットでwgetについて見てみたんですが
良く分かりませんでした。
具体的にどうやって使えば良いのでしょうか?

すみませんが、ご教授よろしくお願いします。

補足日時:2005/04/14 12:00
    • good
    • 0

URLでデータを取得するには、最低でもSocketライブラリ(Socket.pm)が使えるのが必要条件になるのですが(HTML限定であれば、HTTP::LiteやLWPがあるようですが)、サポートしていないと難しいかもしれません。



セキュリティやその他もろもろの関係でcgiから外部サーバーへの接続が出来ないレンタルサーバーは結構あります。

なお、画像の解像度(幅・高さ)などを取得するにはやはりユーティリティを使うか自力で解析ルーチンを埋め込む必要があります。HTMLヘッダ情報から取得できるのは画像のファイルサイズだけなので。

この回答への補足

mth-mmkさん回答ありがとうございます。

HTTP::LiteやLWPはサポートしている様なのですが、具体的な画像データをコピーする方法をご教授して頂けないでしょうか。

補足日時:2005/04/11 23:09
    • good
    • 0

open( $in, $IMG ) || return( '', -1, -1 );



これは無理ですね。open関数ではURLからファイルを
取得できません。

URLから画像を直接開かずに、モジュールであればLWPや
HTTP::Liteで画像を取得して、大きさを得てから、
画像を削除する、という処理にすればいいと思います。

ちなみにサーバ自体にインストールされてないモジュール
であっても自分でアップロードすればいいだけじゃ
ないんでしょうか。そしてuse libすれば使えますよ。

この回答への補足

angbandさん回答ありがとうございます。

>URLから画像を直接開かずに、モジュールであればLWPや
HTTP::Liteで画像を取得して、大きさを得てから、
画像を削除する、という処理にすればいいと思います。

HTTP::Liteで画像を取得する方法を検索サイトで調べたのですが、良く分かりませんでした。
具体的な方法をご教授して頂けないでしょうか?

補足日時:2005/04/11 23:06
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!