• ベストアンサー
  • 困ってます

Perlで画像のサイズ取得する方法

  • 質問No.1324310
  • 閲覧数659
  • ありがとう数2
  • 回答数5

お礼率 73% (68/92)

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;

質問者が選んだベストアンサー

  • 回答No.3
  • ベストアンサー

ベストアンサー率 55% (526/942)

LWPが使えるのなら・・

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

という記述で、$content に取り込めると思います。
補足コメント
meikenpochi

お礼率 73% (68/92)

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

その他の回答 (全4件)

  • 回答No.5

ベストアンサー率 55% (526/942)

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

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

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

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

と言うカンジで。

直リン云々の部分は、何をどう判定したいのか、わかりません。
というか、そもそも何をしようとしているのか良く理解できてません。
お礼コメント
meikenpochi

お礼率 73% (68/92)

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
  • 回答No.4

ベストアンサー率 51% (86/168)

LWPのサンプルコードはすでに書かれてますね。
これでLWPモジュールがあれば解決かと思います。

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

system("wget http://i.yimg.jp/images/main11.gif");
補足コメント
meikenpochi

お礼率 73% (68/92)

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

すみませんが、ご教授よろしくお願いします。
投稿日時:2005/04/14 12:00
  • 回答No.2

ベストアンサー率 38% (35/90)

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

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

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

お礼率 73% (68/92)

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

HTTP::LiteやLWPはサポートしている様なのですが、具体的な画像データをコピーする方法をご教授して頂けないでしょうか。
投稿日時:2005/04/11 23:09
  • 回答No.1

ベストアンサー率 51% (86/168)

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

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

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

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

お礼率 73% (68/92)

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

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

HTTP::Liteで画像を取得する方法を検索サイトで調べたのですが、良く分かりませんでした。
具体的な方法をご教授して頂けないでしょうか?
投稿日時:2005/04/11 23:06
関連するQ&A

その他の関連するQ&Aをキーワードで探す

ピックアップ

ページ先頭へ