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で質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) 【VBA】写真の貼り付けコードがうまく機能しません。 5 2022/09/01 18:43
- CGI htmlからパラメータで、cgiに渡したい。 1 2023/02/06 16:15
- JavaScript jQueryでのドラッグアンドドロップについて 1 2022/07/30 09:10
- HTML・CSS 書籍を見つつサイト造りの練習をしているのですが、見た目が一致しません 2 2022/11/28 15:00
- HTML・CSS CSSが効かずどのように指定すれば良いか分からないのでアドバイスお願い致します 2 2023/06/07 12:25
- CGI perlで書いたcgiでsqliteの使い方を教えてください 2 2023/05/08 21:29
- HTML・CSS img と p を縦中央に配置したいのですがうまくいきません。 2 2023/01/12 14:38
- PHP PHPでユーザー情報を入力して簡易ログイン機能をつくってみたのですが 1 2023/05/29 08:51
- JavaScript vertical sliderをautoplayしたい 2 2022/08/25 14:47
- JavaScript 画像の表示位置 3 2022/12/23 08:25
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
laravel 本番環境でメールが送...
-
LCD ディスプレイを Raspberry ...
-
Chart::Gnuplotの使い方
-
グラフのX,Y座標を取得したい
-
ユーザー定義関数に#NAME?が返...
-
例外処理のフローチャートの記...
-
Excel VBAでリンク切れをチェッ...
-
「デバイスは PRN を初期化でき...
-
文章の分割
-
VBでグローバル変数を宣言するには
-
Excel VBA 『Call』で呼び出す...
-
Perlソースコードをコンパイル...
-
エクセルVBAでシートモジュール...
-
Form間の値の渡し方
-
モジュールとは何ですか
-
[ASP]条件によってインクルード...
-
「Perl Command Line InterPret...
-
'Range'メソッドは失敗しました
-
ppmのリポジトリの場所
-
Excel VBAで、ユーザーフォー...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
LCD ディスプレイを Raspberry ...
-
Perlで画像のサイズ取得する方法
-
"use CGI::Session"でエラーが...
-
laravel 本番環境でメールが送...
-
DBIが入っているはずですが、、、
-
Unicode::Japanese を継承できない
-
WWW::Mechanizeがプロシキ経由...
-
警告を消したい
-
PerlでHashのキーを制限したい
-
Chart::Gnuplotの使い方
-
リンク先の画像サイズの取得
-
perlで指定か所のurlを取り出し...
-
htmlフォームから受け取ったフ...
-
データベースに接続したい
-
エラーでハマっている為、use A...
-
perlからDBIを使用したpostgres...
-
(Perl CPAN) DBDがはいらない
-
例外処理のフローチャートの記...
-
Excel VBAでリンク切れをチェッ...
-
ユーザー定義関数に#NAME?が返...
おすすめ情報