画像をhtmlに埋め込む際、単一の場合は img/src、複数の拡張子を指定すると img/source/srcsetに展開してくれる便利関数。また、単一拡張子のみが指定されている場合は、ブラウザのサポート状況に応じ、avifやwebpの拡張子を持つ同名のファイルがある場合は[avif/webp]の優先順位で表示する画像ファイル名(拡張子)を変更するおまけ機能付き。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 | /* * $src: 画像ファイル名。'|' で区切られている拡張子がある場合は source srcset に展開 * picture.jpg => <img src="picture.jpg" /> * picture.jpg|avif|webp => <source></source> * <srcset picture.avif="" type="image/avif"> * <srcset picture.webp="" type="image/webp"> * <srcset picture.jpg=""> * * * picture.jpg[2x,3x] => <source></source> * * $width/$height/$alt/$title: 画像幅/画像高さ/alt文字列/title文字列 * * */ function img( $src , $width =null, $height =null, $alt =null, $title =null, $additem =null) { Global $accept_images ; $w = $width ? " width=\"{$width}\"" : "" ; $h = $height ? " height=\"{$height}\"" : "" ; // img タグ生成。複数拡張子は pictureタグを生成 $imgsrc = explode ( '|' , $src ); // 複数拡張子を分解(|があれば) $nimgsrc = count ( $imgsrc ); // 追加拡張子の数(|がなければ 1) if ( $nimgsrc > 1) { // 複数拡張子の時の処理 $src = $imgsrc [0]; // オリジナルの画像ファイル名を保存 $imgbase = substr ( $imgsrc [0], 0, strrpos ( $imgsrc [0], '.' )); // 拡張子を外したファイル名を抽出 echo "<picture>\n" ; for ( $i = 1; $i < $nimgsrc ; $i ++) { // 拡張子を変えながら srcsetを作成 printf( "\t<source srcset=\"%s.%s\" type=\"image/%s\" />\n" , $imgbase , $imgsrc [ $i ], $imgsrc [ $i ]); } printf( "\t<source srcset=\"%s\" />\n" , $imgsrc [0]); // オリジナルの画像を最後に追加 } elseif ( $accept_images ) { $src = optimalimage( $src ); } // img タグの共通部分を表示 (タグはここでは閉じない) printf ( '<img src="%s"%s%s alt="%s" title="%s" loading="lazy"' , $src , $w , $h , $alt , $title ); if ( $additem ) print " {$additem}" ; // img タグの閉じ括弧を表示 print ' />' ; if ( $nimgsrc > 1 ) echo "</picture>\n" ; } function optimalimage( $src ) { Global $accept_images ; $imgbase = substr ( $src , 0, strrpos ( $src , '.' )); $testuri = ( $imgbase [0] == '/' ? $_SERVER [ 'DOCUMENT_ROOT' ] : '' ) . $imgbase ; if (isset( $accept_images [ 'avif' ]) && file_exists ( $testuri . '.avif' )) { $src = $imgbase . '.avif' ; } elseif (isset( $accept_images [ 'webp' ]) && file_exists ( $testuri . '.webp' )) { $src = $imgbase . '.webp' ; } return $src ; } /* * あらかじめグローバル変数$accept_images(配列)をセットしておく */ global $accept_images = null; $allheaders = getallheaders (); if (isset( $allheaders [ 'Accept' ])) { preg_match_all( '|image/([a-z]+)|' , $allheaders [ 'Accept' ], $matchimages ); foreach ( $matchimages [1] as $imgname ) { $accept_images [ "{$imgname}" ] = true; } } |
0 件のコメント:
コメントを投稿