画像をhtmlに埋め込む際、単一の場合は img/src、複数の拡張子を指定すると img/source/srcsetに展開してくれる便利関数。また、単一拡張子のみが指定されている場合は、ブラウザのサポート状況に応じ、avifやwebpの拡張子を持つ同名のファイルがある場合は[avif/webp]の優先順位で表示する画像ファイル名(拡張子)を変更するおまけ機能付き。
/* * $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 件のコメント:
コメントを投稿