画像サイズ取得 - PHPプロ!Q&A掲示板

1249

  • 0P

画像サイズ取得

質問日時 / 2008年6月19日 17:42    回答数 / 5件

Questioner:  agupx  このエントリーをはてなブックマークに追加 

キーワード / キーワードが設定されていません

画像のサイズを取得して表示させたくマニュアルを調べたところ以下の方法で実現できました。

  1. list($width, $height, $type, $attr) = getimagesize("./img/logo.png");
  2. echo "<img src=\"./img/logo.png\" $attr alt=\"example\" />";

この場合./img/logo.pngのみに有効なのですがサイズを取得したいファイルが複数ある場合
どのようにすれば可能でしょうか?

表示する画像の拡張子は.jpg,.gif,.pngなので配列で定義しgetimagesizeを応用してなんとか
できないものかと自分なりに調べてみましたが情報が見つかりませんでした。

画像ファイル名は規則性がなく階層も異なる場合もあるの無理を承知での質問とはなりますが
宜しくお願い致します。

この質問への意見の募集は締め切られ、ポイントは既に配分されました。
意見を投稿することはできますが、ポイントを受け取ることはできません。



ツリー一覧

┗A01weekendphp配列内の画像タグを生成するスクリプト、という事であ
 ┗A01-1agupxお返事ありがとうございます。 やはり画像までのパス
  ┗A01-1-1kaitauこんばんわ > width,heightは省略可能な事はわかっ
   ┗A01-1-1-1agupxお返事ありがとうございます。 >W3C勧告において
    ┗A01-1-1-1-1TorrySegallwidth, height 属性は、値が指定されていれば ブラウ

回答一覧

並び替え:

A01
answererweekendphp [6月19日 18:43]

配列内の画像タグを生成するスクリプト、という事であれば、
下記のような感じかと。

  1. <?php
  2.     // 配列の定義
  3.     $img_array = array(
  4.             './img/logo.png',
  5.             './img/path/to/image.gif',
  6.             './img/path/to/image.jpeg',
  7.             './img/path/to/image.png'
  8.         );
  9.  
  10.     foreach ($img_array as $value) {
  11.         echo get_image_tag($value);
  12.     }
  13.  
  14.     function get_image_tag($file)
  15.     {
  16.         if (!file_exists($file)) {
  17.             // ファイルが無ければfalse
  18.             return false;
  19.         }
  20.  
  21.         list($width$height$type$attr) = getimagesize($file);
  22.         return "<img src=\"{$file}\" $attr alt=\"example\" />";
  23.     }

参考まで。

この意見に回答する

ツリーへ TOPへ

A01-1
replyeragupx [6月19日 20:25]

お返事ありがとうございます。
やはり画像までのパスを全て定義しないとできませんよね・・・

画像の並びやファイル名が連番などの規則性を持っているのであれば教えて頂いた方法よりも
さらにスムーズに実行することができると思うのですが今回は規則性を持ち合わせていない場合の
ケースで

できれば
<img src="hoge.gif" . $size . alt="" />
<img src="hoge.jpg" . $size . alt="" />
<img src="hoge.jpg" . $size . alt="" />
のように画像表示のhtmlはべた書きでwidth,heightは自動で取得し表示するという形式に
できればと思っておりました。


width,heightは省略可能な事はわかっているのですがhtmlの文法を意識すると省略できずで・・・
画像を変える度にサイズの値も変更するには手間に感じてしまう事もあり質問させて頂きました。

この意見に回答する

ツリーへ TOPへ

A01-1-1 満足
replyerkaitau [6月19日 21:47] (最終編集:6月19日 22:09)

こんばんわ

> width,heightは省略可能な事はわかっているのですがhtmlの文法を意識すると省略できずで・・・
別にhtmlの文法を意識するからといって、width,heightは必須ではないですよ。
W3C勧告においても、alt属性は必須であるとしてますが、
width,heightの必要性には言及していなかったと思います。多分。

imgのalt
http://www.w3.org/TR/html401/struct/objects.html#adef-alt
imgのwidthとheight
http://www.w3.org/TR/html401/struct/objects.html#adef-height-IMG
# それどころかwidthとheightはちょっと上で非推奨と言っているような気がしなくも無い。。。

あと、自動で取得して表示する、という一つの方法として。
htmlの内容から画像の指示を抜き出して力技で取得する、という方法もあります。
いっつもやってるとスクリプトの負荷がちょっとあるかもしれませんが。

以下サンプル
  1. <?php
  2. /**
  3.  * 正規表現を用いてimgタグを検出して、imgタグにsizeをつける関数を呼ぶ。
  4.  */
  5. function imgsize_substitute($val) {
  6.   $val = preg_replace_callback('|<img(.*?)src="(.+?)"(.*?)>|i','set_img_size',$val);
  7.   return $val;
  8. }
  9. /**
  10.  * 正規表現で検出された中身からファイル名を取り出し、画像サイズを求めてタグの属性につける。
  11.  * $matched[0] - preg_replace_callback で「マッチした全体」
  12.  * $matched[1] - preg_replace_callback で「imgよりあと、src="..."より前にマッチした部分」
  13.  * $matched[2] - preg_replace_callback で「src="..."でマッチした中身」
  14.  * $matched[3] - preg_replace_callback で「src="..."以降タグが終わるまでの中身」
  15.  */
  16. function set_img_size($matched) {
  17.   //既にsize属性を持っていたら、何もしない
  18.   if( strpos($matched[1],'size') !== false 
  19.     || strpos($matched[3],'size') !== false ) {
  20.     return $matched[0];
  21.   }
  22.   $imgsrc = $matched[2];
  23.   if( strpos($imgsrc,'http://') === false ) {
  24.     // 'http://'で始まるソース名でない場合
  25.     if( strpos($imgsrc,'/') === 0 ) {
  26.       // '/'で始まるソース名の場合は、DOCUMENT_ROOTを付与。
  27.       $imgsrc = $_SERVER['DOCUMENT_ROOT'].$imgsrc;
  28.     } else {
  29.       //それ以外の場合は、現在のスクリプトのパスを付与
  30.       $imgsrc = dirname($_SERVER['SCRIPT_FILENAME']).DIRECTORY_SEPARATOR.$imgsrc;
  31.     }
  32.   }
  33.   $sizes = getimagesize($imgsrc);
  34.   //取得に失敗したら、何もしない
  35.   if( $sizes === false ) {
  36.     return $matched[0];
  37.   }
  38.   $tag = "<img${matched[1]}src=\"${matched[2]}\" width=\"${sizes[0]}\" height=\"${sizes[1]}\"${matched[3]}>";
  39.   return $tag;
  40. }
  41.  
  42.   //出力内容をバッファリングしてimgsize_substitute関数に渡す
  43.   ob_start("imgsize_substitute");
  44. ?>
  45. <html>
  46. <body>
  47. test:
  48. <hr />
  49. <div>
  50. 同じ場所のhoge.gif<br />
  51. <img src="hoge.gif" alt="" />
  52. </div>
  53. <div>
  54. 一つ上の階層のhoge.jpg<br />
  55. <img src="../hoge.jpg" alt="" />
  56. </div>
  57. <div>
  58. 他の場所のhoge.gif<br />
  59. <img src="/another_dir/hoge.gif" alt="" />
  60. </div>
  61. </body>
  62. </html>
上記ソースの結果の実際のブラウザのHTMLソースの例:
  1. <html>
  2. <body>
  3. test:
  4. <hr />
  5. <div>
  6. 同じ場所のhoge.gif<br />
  7. <img src="hoge.gif" width="30" height="30" alt="" />
  8. </div>
  9. <div>
  10. 一つ上の階層のhoge.jpg<br />
  11. <img src="../hoge.jpg" width="233" height="170" alt="" />
  12. </div>
  13. <div>
  14. 他の場所のhoge.gif<br />
  15. <img src="/another_dir/hoge.gif" width="180" height="180" alt="" />
  16. </div>
  17. </body>
  18. </html>

====
追記。
http:// で始まる画像名を考慮。変換するかどうかは、allow_url_openの設定値次第

この意見に回答する

ツリーへ TOPへ

A01-1-1-1
replyeragupx [6月19日 22:20]

お返事ありがとうございます。

>W3C勧告においても、alt属性は必須であるとしてますが、
>width,heightの必要性には言及していなかったと思います。多分。

参照ページが英語だったので読めず確認のためぐぐってみたのですが確かにaltは必須ですが
width,heightに関しては特に触れてないですね・・・

htmlを勉強していた際に何かを見てそのように思い込んでいただけのようで大変失礼致しました。


サンプルのスクリプトですができないものかと思っていたので感激でした!
こんなとこにも正規表現とは全く想像すらできませんでした^^;

確かに毎回実行するとなると負荷が掛かりそうですがせっかくですので実験してみたいと思います!

この意見に回答する

ツリーへ TOPへ

A01-1-1-1-1
replyerTorrySegall [6月21日 04:04]

width, height 属性は、値が指定されていれば
ブラウザはHTMLを読み込んだ時点で描画サイズを確定できます。
言い換えれば、
当該画像ファイルを取得しきらないうちにページレイアウトが確定するわけで
ページ表示が速くなって快適なブラウジングを提供できる
という根拠によって(W3C勧告云々ではなくTIPSとして)推奨されるものです。

画像が1枚、表示完了となる度に
それよりも下のテキストが移動してしまうので
表示の重いサイトでストレスを感じた。
というような経験はありませんか?

それを防止する効果があるよ。というわけですね。

ですから『HTML講座』を名乗るサイトの中には、
これらを必須と謳った半可通サイトも少なからずあった事でしょう。

いわゆる『物理属性』に相当するものですからW3C非推奨のように思われがちですが、
画像を原寸表示させたい場合にも「CSSで指定しろよ」というのも
サイトのメンテナンス性を考えたら、CSSの理念に反する話でしょうね。
したがって、非推奨属性でもありません。

以上、蛇足ながら。

この意見に回答する

ツリーへ TOPへ

<<質問一覧へ



Pick Up Q&A

Q
動的なURLを静的に見せる方法
 このエントリーをはてなブックマークに追加 
A
普通に考えて、mod_rewrite でしょうね。 http://www.nishishi.com/blog/2006/01/mod_rewrite_url.html...

>>続きを読む

GETのままでは検索エンジンのロボットが拾ってくれなかったためにSEO対策として有効だと言われていますね。

▲解説者:岡本(アシアル株式会社 教育コーディネーター兼 システムエンジニア)