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ベストアンサー
- 回答日時:
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インストールしてくれました。
No.5
- 回答日時:
>それと同時にアクセスがあった時、この方法でOKでしょうか?
固定のファイルをワークにしているので、同時アクセスは問題があるでしょう。
LOCK制御したところで、WAITする訳じゃないし...
image::sizeのソースを読む限り、in-memoryで勝負できるんじゃないかな。
$pic_url = $FORM{'url'};
$content = get("$pic_url");
($x,$y)=imgsize(\$content);
と言うカンジで。
直リン云々の部分は、何をどう判定したいのか、わかりません。
というか、そもそも何をしようとしているのか良く理解できてません。
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
No.4
- 回答日時:
LWPのサンプルコードはすでに書かれてますね。
これでLWPモジュールがあれば解決かと思います。
別解として、コマンドを使ってもいいですね。
以下はwgetを使う方法です。
system("wget http://i.yimg.jp/images/main11.gif");
この回答への補足
angbandさん、回答ありがとうございます。
system("wget http://i.yimg.jp/images/main11.gif");
ネットでwgetについて見てみたんですが
良く分かりませんでした。
具体的にどうやって使えば良いのでしょうか?
すみませんが、ご教授よろしくお願いします。
No.2
- 回答日時:
URLでデータを取得するには、最低でもSocketライブラリ(Socket.pm)が使えるのが必要条件になるのですが(HTML限定であれば、HTTP::LiteやLWPがあるようですが)、サポートしていないと難しいかもしれません。
セキュリティやその他もろもろの関係でcgiから外部サーバーへの接続が出来ないレンタルサーバーは結構あります。
なお、画像の解像度(幅・高さ)などを取得するにはやはりユーティリティを使うか自力で解析ルーチンを埋め込む必要があります。HTMLヘッダ情報から取得できるのは画像のファイルサイズだけなので。
この回答への補足
mth-mmkさん回答ありがとうございます。
HTTP::LiteやLWPはサポートしている様なのですが、具体的な画像データをコピーする方法をご教授して頂けないでしょうか。
No.1
- 回答日時:
open( $in, $IMG ) || return( '', -1, -1 );
これは無理ですね。open関数ではURLからファイルを
取得できません。
URLから画像を直接開かずに、モジュールであればLWPや
HTTP::Liteで画像を取得して、大きさを得てから、
画像を削除する、という処理にすればいいと思います。
ちなみにサーバ自体にインストールされてないモジュール
であっても自分でアップロードすればいいだけじゃ
ないんでしょうか。そしてuse libすれば使えますよ。
この回答への補足
angbandさん回答ありがとうございます。
>URLから画像を直接開かずに、モジュールであればLWPや
HTTP::Liteで画像を取得して、大きさを得てから、
画像を削除する、という処理にすればいいと思います。
HTTP::Liteで画像を取得する方法を検索サイトで調べたのですが、良く分かりませんでした。
具体的な方法をご教授して頂けないでしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
- ・ゆるやかでぃべーと タイムマシンを破壊すべきか。
- ・歩いた自慢大会
- ・許せない心理テスト
- ・字面がカッコいい英単語
- ・これ何て呼びますか Part2
- ・人生で一番思い出に残ってる靴
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・初めて自分の家と他人の家が違う、と意識した時
- ・単二電池
- ・チョコミントアイス
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
LCD ディスプレイを Raspberry ...
-
警告を消したい
-
例外処理のフローチャートの記...
-
VBでグローバル変数を宣言するには
-
VBSがコンパイルエラーになりま...
-
Excel VBAでリンク切れをチェッ...
-
Excel VBAで、ユーザーフォーム...
-
Perlソースコードをコンパイル...
-
Excel VBA 定義されたプロージ...
-
acwzlibとは?
-
エクセルVBAでシートモジュール...
-
perlを使って音(sound.wav)を...
-
モジュールの最大数はいくつな...
-
'Range'メソッドは失敗しました
-
Form間の値の渡し方
-
VBA This Workbookモジュール...
-
Excel VBA 『Call』で呼び出す...
-
ベースモジュールって?
-
ユーザー定義関数をEXCELに常駐...
-
VBA ユーザーフォーム Image1 ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
LCD ディスプレイを Raspberry ...
-
laravel 本番環境でメールが送...
-
警告を消したい
-
Perlで画像のサイズ取得する方法
-
perlからDBIを使用したpostgres...
-
MySQLとの接続でfetchrow_array...
-
XML::RSSモジュールインストー...
-
DBD::mysqlで「表」という文字...
-
CGI::Carpを使っているのにInte...
-
DBIが入っているはずですが、、、
-
(Perl CPAN) DBDがはいらない
-
フォームメール@PerlとActiveP...
-
htmlフォームから受け取ったフ...
-
PerlコマンドでURLからサムネイ...
-
Chart::Gnuplotの使い方
-
リンク先の画像サイズの取得
-
例外処理のフローチャートの記...
-
Excel VBAでリンク切れをチェッ...
-
「デバイスは PRN を初期化でき...
-
エクセルVBAでシートモジュール...
おすすめ情報