• ベストアンサー

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

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;

  • Perl
  • 回答数5
  • ありがとう数2

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

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

LWPが使えるのなら・・ use LWP::Simple; $content = get("http://i.yimg.jp/images/main11.gif"); という記述で、$content に取り込めると思います。

meikenpochi
質問者

補足

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インストールしてくれました。

その他の回答 (4)

回答No.5

>それと同時にアクセスがあった時、この方法でOKでしょうか? 固定のファイルをワークにしているので、同時アクセスは問題があるでしょう。 LOCK制御したところで、WAITする訳じゃないし... image::sizeのソースを読む限り、in-memoryで勝負できるんじゃないかな。 $pic_url = $FORM{'url'}; $content = get("$pic_url"); ($x,$y)=imgsize(\$content); と言うカンジで。 直リン云々の部分は、何をどう判定したいのか、わかりません。 というか、そもそも何をしようとしているのか良く理解できてません。

meikenpochi
質問者

お礼

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

  • angband
  • ベストアンサー率51% (86/168)
回答No.4

LWPのサンプルコードはすでに書かれてますね。 これでLWPモジュールがあれば解決かと思います。 別解として、コマンドを使ってもいいですね。 以下はwgetを使う方法です。 system("wget http://i.yimg.jp/images/main11.gif");

meikenpochi
質問者

補足

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

  • mth-mmk
  • ベストアンサー率38% (35/90)
回答No.2

URLでデータを取得するには、最低でもSocketライブラリ(Socket.pm)が使えるのが必要条件になるのですが(HTML限定であれば、HTTP::LiteやLWPがあるようですが)、サポートしていないと難しいかもしれません。 セキュリティやその他もろもろの関係でcgiから外部サーバーへの接続が出来ないレンタルサーバーは結構あります。 なお、画像の解像度(幅・高さ)などを取得するにはやはりユーティリティを使うか自力で解析ルーチンを埋め込む必要があります。HTMLヘッダ情報から取得できるのは画像のファイルサイズだけなので。

meikenpochi
質問者

補足

mth-mmkさん回答ありがとうございます。 HTTP::LiteやLWPはサポートしている様なのですが、具体的な画像データをコピーする方法をご教授して頂けないでしょうか。

  • angband
  • ベストアンサー率51% (86/168)
回答No.1

open( $in, $IMG ) || return( '', -1, -1 ); これは無理ですね。open関数ではURLからファイルを 取得できません。 URLから画像を直接開かずに、モジュールであればLWPや HTTP::Liteで画像を取得して、大きさを得てから、 画像を削除する、という処理にすればいいと思います。 ちなみにサーバ自体にインストールされてないモジュール であっても自分でアップロードすればいいだけじゃ ないんでしょうか。そしてuse libすれば使えますよ。

meikenpochi
質問者

補足

angbandさん回答ありがとうございます。 >URLから画像を直接開かずに、モジュールであればLWPや HTTP::Liteで画像を取得して、大きさを得てから、 画像を削除する、という処理にすればいいと思います。 HTTP::Liteで画像を取得する方法を検索サイトで調べたのですが、良く分かりませんでした。 具体的な方法をご教授して頂けないでしょうか?

関連するQ&A

  • ループ処理された中でfile_existsによる画像サイズが取得できま

    ループ処理された中でfile_existsによる画像サイズが取得できません。 ループlist関数で変数代入しDisp_Img_Tag_02関数へ引数を渡した場合に引数側へ変数は渡っていることは確認しているのですが、問題解決に至りません。コードの問題指摘と解決方法をアドバイスください。 ログファイル/  1,ばなな,黄色いくだものです,1278105473-01.jpg <?php $logfile = "./db.csv"; //ログデータ $array_log = file($logfile); for($i=0; $i<count($array_log); $i++){ list($code,$text_01,$area_01,$img_01_Filename) = split(",", $array_log[$i]); echo Disp_Img_Tag_02("1278105473-01.jpg")."<br>"; //(1)直接ファイルを指定 echo Disp_Img_Tag_02("$img_01_Filename")."<br>"; //(2)***ここが問題です。 } echo "<br><br>"; $img_01_Filename = "1278105473-01.jpg"; echo Disp_Img_Tag_02("1278105473-01.jpg")."<br>"; //確認用OK echo Disp_Img_Tag_02("$img_01_Filename")."<br>"; //確認用OK function Disp_Img_Tag_02($img_name, $type) { $path = realpath( "." )."/img/"; //アップロード画像パス $up_dir = '/img/'; //画像リンク先パス $w_admin_max = 30; //管理用サイズ $h_admin_max = 30; $w_user_max = 100; //ユーザー用サイズ $h_user_max = 100; $img_tag = ""; if($img_name && file_exists("$path$img_name")){ list($width, $height, $dummy01, $dummy02 ) = getimagesize("$path$img_name"); if($width > $w_admin_max || $height > $h_admin_max){ $w_rate = $w_admin_max / $width; $h_rate = $h_admin_max / $height; ($w_rate < $h_rate) ? $key = $w_rate : $key = $h_rate; $width = (int) $width * $key; $height = (int) $height * $key; $img_tag = $img_tag."<a href=.$up_dir$img_name target=_blank><img src=.$up_dir$img_name width=" . $width . " height=" . $height . " border=0></a>\n"; }else{ $img_tag = $img_tag."<img src=.$up_dir/$img_name border=0>\n"; } $img_tag = $img_tag."<input type=hidden name=fname01 value=\"$img_name\"><input type=checkbox name=fname01_del value=1>削除\n"; $img_tag = $img_tag." 上書:<input type=file name=upfile01 size=15>\n"; }else{ $img_tag = $img_tag."登録 <input type=file name=upfile01 size=20> 確認用ファイル名 $img_name\n"; } return $img_tag; } ?>

    • ベストアンサー
    • PHP
  • perlで画像表示

    htmlファイルから<img src="./aa.cgi">と書いて連続した画像を表示させたいのですが @aa =(1,2,3); foreach(@aa){ open(IMG, "./$_.gif"); binmode(IMG); binmode(STDOUT); print "Content-type: image/gif\n\n"; read(IMG, $img, 1024); print $img; close(IMG); } こう書いたらだめなのでしょうか?

    • ベストアンサー
    • Perl
  • 横並びの画像で、ブラウザの幅を縮めても、二段にならない方法は?

    よろしくお願いします。 下記のように書いて、画像を横並びにしています。 ただ、ブラウザの幅を縮めると、二段になっていまいます。 幅を縮めても、一段のまま保持するには、どのように書けば良いでしょうか? <img src="aa1.gif" width="100px" height="100px'> <img src="aa2.gif" width="100px" height="100px'> <img src="aa3.gif" width="100px" height="100px'> <img src="aa4.gif" width="100px" height="100px'>

  • 変数名で付けた画像の表示方法

    初心者ですよろしくお願いします 画像をforで回し表示いたいのですが以下3方法試しましたがいずれもうまく表示されません  Perlは文字列と数値が私にとってあいまいなので----と言うかそれ以前の問題ですね HTMLに変数名を入れても無理ですね今気がつきました cgiで画像を表示するのはどうしたらよろしいでしょうか?ご指導お願いします $kaku =".gif"; @bb = ( "0.gif","1.gif","2.gif","3.gif","4.gif"); for($i=0; $i<=$#file; $i++){ $jj=$i.$kaku; $jjj=length($jj);  #レングス5になってました print "<img src=\"$jj\" width=\"55\" height=\"35\">\n"; print "<img src=\"$bb[$i]\" width=\"55\" height=\"35\">\n"; print <<EOM; <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <img src= "$jj" width="55" height="35"> EOM }

  • 画像を縦に並べたら隙間ができることについて

    画像を縦に並べたところ隙間ができてしまいます。 隙間無くくっつけたいのですがどうすればいいのでしょうか。 以下htmlです。 <img src="img/nakama_img01.gif" width="687" height="227" alt="画像1" /><br /> <img src="img/nakama_img02.gif" width="687" height="197" alt="画像2" /><br /> <img src="img/nakama_img03.gif" width="687" height="244" alt="画像3" /> <br />で改行せずくっつけてタグを並べても同じ結果でした。 よろしくお願いします。

    • ベストアンサー
    • HTML
  • tableの作成方法について

    よろしくお願いします。 表を以下のように作成しました。 表の横のラインに罫線を引きたいのですが記述方法が分かりません。 表の周りにはcssで記述して2pxの罫線を引いてあります。 どなた様か、ご指導の程よろしくお願いします <table> <tr> <td rowspan="3" class="b"><img src="img/wg.jpg" alt="パソコンノウハウ" width="190" height="250" /></td> <td class="c"><img src="img/txt21.gif" alt="" width="168" height="24" /><br /> </td> </tr> <tr> <td class="d"><img src="img/9.gif" alt="パソコンノウハウ" width="41" height="63" /> <img src="img/ten.gif" alt="パソコンノウハウ" width="21" height="63" /><img src="img/8.gif" alt="パソコンノウハウ" width="41" height="63" /> <img src="img/0.gif" alt="パソコンノウハウ" width="41" height="63" /><img src="img/0.gif" alt="パソコンノウハウ" width="41" height="63" /> <img src="img/en.gif" alt="パソコンノウハウ" width="131" height="63" /></td> </tr> <tr> <td class="e"><a href="http://www."><img src="img/enter_off.gif" alt="" width="349" height="83" /></a></td> </tr> ----------------------------------------------------------------ここに横の罫線を引きたいのですが記述方法が分かりません。 <tr> <td rowspan="3" class="b"><img src="img/wg.jpg" alt="パソコンノウハウ" width="190" height="250" /></td> <td class="c"><img src="img/txt22.gif" alt="" width="103" height="23" /><br /> </td> </tr> <tr> <td class="d"><img src="img/1.gif" alt="パソコンノウハウ" width="41" height="63" /><img src="img/0.gif" alt="パソコンノウハウ" width="41" height="63" /> <img src="img/ten.gif" alt="パソコンノウハウ" width="21" height="63" /><img src="img/8.gif" alt="パソコンノウハウ" width="41" height="63" /> <img src="img/0.gif" alt="パソコンノウハウ" width="41" height="63" /><img src="img/0.gif" alt="パソコンノウハウ" width="41" height="63" /> <img src="img/en.gif" alt="パソコンノウハウ" width="131" height="63" /> </td> </tr> <tr> <td class="e"><a href="http://"><img src="img/enter_off.gif" alt="" width="349" height="83" /></a></td> </tr> </table>

    • ベストアンサー
    • HTML
  • cssヘッダー画像の下に配置したい画像が重なります

    css勉強し始めた初心者なので、説明やソースなどめちゃくちゃだと思いますが、教えてください。 固定ヘッダー(常に画面の上にヘッダーがあるように)を作成し、その下に画像を配置したのですが、ヘッダーの下にその画像が入り込んでしまいました。ヘッダーの下に重ならず配置するにはどうすればよいでしょうか? よろしく御願いいたします。 body内に <div id="header"> <h1><a href="/" title="website"></a></h1> <img src="img/b01.gif" width="108" height="68" border="0" onmouseover="this.src='../ao/img/b01-.gif" onmouseout="this.src='../ao/img/b01.gif"> <img src="img/b02.gif" width="88" height="68" border="0" onmouseover="this.src='../ao/img/b02-.gif'" onmouseout="this.src='../ao/img/b02.gif'"> <img src="img/b03.gif" width="59" height="61" border="0" onmouseover="this.src='../ao/img/b03-.gif'" onmouseout="this.src='../ao/img/b03.gif'"> <img src="img/b04.gif" width="50" height="68" border="0" onmouseover="this.src='../ao/img/b04-.gif'" onmouseout="this.src='../ao/img/b04.gif'"> <img src="img/b05.gif" width="39" height="68" border="0" onmouseover="this.src='../ao/img/b05-.gif'" onmouseout="this.src='../ao/img/b05.gif'"> <img src="img/b06.gif" width="80" height="68" border="0" onmouseover="this.src='../ao/img/b06-.gif'" onmouseout="this.src='../ao/img/b06.gif'"> <img src="img/b07.gif" width="51" height="68" border="0" onmouseover="this.src='../ao/img/b07-.gif'" onmouseout="this.src='../ao/img/b07.gif'"> <img src="img/b08.gif" width="47" height="68" border="0" onmouseover="this.src='../ao/img/b08-.gif'" onmouseout="this.src='../ao/img/b08.gif'"> <img src="img/b09.gif" width="54" height="68" border="0" onmouseover="this.src='../ao/img/b09-.gif'" onmouseout="this.src='../ao/img/b09.gif'"> <img src="img/b10.gif" width="125" height="68" border="0" onmouseover="this.src='../ao/img/b10-.gif'" onmouseout="this.src='../ao/img/b10.gif'"> </div> <h2><img src="img/panichi.gif" alt="TOP" width="700" height="450" class="centering" /></h2>

    • ベストアンサー
    • HTML
  • getimagesizeで画像がなかった場合の処理

    getimagesizeを使って画像のサイズ一覧を取得するプログラムを作っています。 画像ファイル名は規則正しい数字の番号を振ってあります。 規則に従いループさせているのですが、画像がなかった場合、 うまく動作してくれません。 画像の大きさがある程度あるので横幅の10pxで判断しています。 $filename= "xxx.jpg"; list($width,$height)=getimagesize("$filename"); if($width > 10){ //あった場合の処理 }else{ //なかった場合の処理 } getimagesizeを使って画像がなかった場合、すり抜ける方法はありますでしょうか? よろしくお願いします。

    • ベストアンサー
    • PHP
  • 画像をcssでレイアウトしたいです

    以下のボックスにあるイメージをボックスの左上を基準に2x2の形に並べたいです。その際にcssのpositionを使用してrelativeを指定して定義したのですがうまくいきません。正しい指定の方法を教えてください。 <div id="bottom_right"> <img src="images/image1.gif" width="176" height="57" /> <img src="images/image2.gif" width="176" height="57" /> <img src="images/image3.gif" width="176" height="57" /> <img src="images/image4.gif" width="176" height="57" /> </div>

    • ベストアンサー
    • HTML
  • 1つの画像オンマウスで3つの画像を切り替えたい!

    現在、下記のような感じで一つの画像オンマウスでその画像を含む3つの画像が切り替わるようにしています。 ---------------------------------- <a href="#" onMouseOver="11111.src='a.gif';22222.src='b.gif';33333.src='c.gif'" onMouseOut="11111.src='a_01.gif';22222.src='b_01.gif';33333.src='c_03.gif'"><img src="aaaaaa.gif" alt="" width="94" height="32" border="0" name="11111" /></a> <img src="b_01.gif" alt="" width="572" height="50" name="22222" /> <img src="c_01.gif" alt="" width="96" height="32" border="0" name="33333" /> ---------------------------------- IE6だと、きちんと表示されるのですが、 Firefoxだと表示がおかしくなります。 改善方法はありませんでしょうか? 助けてください!