PHPで画像ファイルを読み込んでimgタグに埋め込む

(1/1)
HTMLのimgタグでは、href属性の中にbase64エンコードした画像データを埋め込むことができる。そこで今回は、読み込んだ画像を指定サイズに伸縮し、HREF属性の中にbase64エンコードして埋め込むPHPプログラムを作ってみることにする。

目次

サンプル・プログラムの実行例

画像ファイルを読み込んでimgタグに埋め込む

サンプル・プログラム

圧縮ファイルの内容
file2img.phpサンプル・プログラム本体

準備:GDライブラリ

PHPで GDライブラリが有効になっていることが必要だ。
あらかじめ関数  phpinfo  を実行し、GD Support が enableになっていることを確認すること。

準備:初期値

  37: //画像表示サイズ(単位:ピクセル)
  38: define('IMG_WIDTH',  300);
  39: define('IMG_HEIGHT', 200);
  40: 
  41: ini_set('allow_url_fopen', TRUE);

伸縮させる画像サイズは、あらかじめ定数に定義しておく。

解説:画像ファイルを読み込み,imgタグに埋め込み変換する

 175: /**
 176:  * 画像ファイルを読み込み,imgタグに埋め込み変換する
 177:  * @param   string $fname  画像ファイル名
 178:  * @param   int    $width  表示したい幅(ピクセル)
 179:  * @param   int    $height 表示したい高さ(ピクセル)
 180:  * @param   array  $items  読み込んだ画像ファイル情報格納用
 181:  * @param   string $errmsg エラーメッセージ格納用
 182:  * @return  string imgタグ/FALSE:変換失敗
 183: */
 184: function file2img($fname, $width, $height, &$items, &$errmsg) {
 185:     //読み込み関数表
 186:     $table = array(
 187:         //画像形式 => 読み込み関数
 188:         IMAGETYPE_BMP  => 'imagecreatefrombmp',
 189:         IMAGETYPE_GIF  => 'imagecreatefromgif',
 190:         IMAGETYPE_JPEG => 'imagecreatefromjpeg',
 191:         IMAGETYPE_PNG  => 'imagecreatefrompng',
 192:         IMAGETYPE_WEBP => 'imagecreatefromwebp'
 193:     );
 194:     $html = '';
 195: 
 196:     //画像形式
 197:     $imagetype = exif_imagetype($fname);
 198:     $items['imagetype'] = $imagetype;
 199:     if ($imagetype == FALSE) {  
 200:         $errmsg = '"' . $fname . '" が存在しないか,読み込むことができません';
 201:         return FALSE;
 202:     } else {
 203:         foreach ($table as $key=>$func) {
 204:             if ($imagetype == $key) {
 205:                 //画像ファイル読み込み関数の存否チェック
 206:                 if (! function_exists($func)) {
 207:                     $errmsg = 'GDライブラリをインストールしてください';
 208:                     return FALSE;
 209:                 //画像ファイル読み込み
 210:                 } else {
 211:                     $img0 = @$func($fname);
 212:                     if (! $img0) {
 213:                         $errmsg = '"' . $fname . '" を読み込むことができません';
 214:                         return FALSE;
 215:                     }
 216:                     //画像伸縮
 217:                     $width0  = imagesx($img0);
 218:                     $height0 = imagesy($img0);
 219:                     $items['width']  = $width0;
 220:                     $items['height'] = $height0;
 221:                     $magw = (float)$width / (float)$width0;
 222:                     $magh = (float)$height / (float)$height0;
 223:                     $mag  = min($magw, $magh);
 224:                     $width1  = (int)($width0 * $mag);
 225:                     $height1 = (int)($height0 * $mag);
 226:                     $img1 = imagecreatetruecolor($width1, $height1);
 227:                     imagecopyresampled($img1, $img0, 0, 0, 0, 0, $width1, $height1, $width0, $height0);
 228: 
 229:                     //画像データをBASE64エンコード
 230:                     ob_start();
 231:                     imagejpeg($img1);
 232:                     $ss = ob_get_contents();
 233:                     ob_end_clean();
 234:                     $ss = base64_encode($ss);
 235:                     $html = "<img src=\"data:image/jpg;base64," . $ss ."\" />";
 236:                     return $html;
 237:                 }
 238:                 break;
 239:             }
 240:         }
 241:     }
 242:     $errmsg = '"' . $fname . '" は変換できる画像形式ではありません';
 243: 
 244:     return FALSE;
 245: }

今回のプログラムは、ほぼユーザー関数 file2img で完結している。
読み込む画像ファイル名と伸縮サイズを与えると、GDライブラリを使って画像の伸縮を行い、base64形式で埋め込んだimgタグを文字列として返す。おまけ機能として、読み込んだ画像の情報(画像形式、サイズ)を変数 $items に格納するようにした。

PNGやWEBPなど、読み込める画像形式は冒頭の関数表 $table に定義しておく。将来、GDライブラリが拡張された際には、この関数表に追加するだけで新しい画像形式に対応する。また、その画像形式を変換したくなければ、関数表から落としておけばよい。

画像伸縮には GDライブラリの  imagecopyresampled  関数を利用している。

表示用画像は、 imagejpeg  を使って一律にJPEG形式に変換する。
この関数は標準出力にデータを出力する。そこで、 ob_get_contents  を使って、出力先を変数に切り替えてやり、この変数の値を関数  base64_encode  を使ってbase64エンコードする。

解説:ファイルのドロップ

  73: <script>
  74: /**
  75:  * ファイルのドロップ
  76:  * @param   evt  イベント
  77:  * @return  なし
  78: */
  79: function handleFileSelect(evt) {
  80:     evt.stopPropagation();
  81:     evt.preventDefault();
  82: 
  83:     var files = evt.dataTransfer.files; 
  84:     var output = [];
  85: 
  86:     document.getElementById('upload').files = files;
  87:     document.myform.submit();
  88: }
  89: 
  90: function handleDragOver(evt) {
  91:     evt.stopPropagation();
  92:     evt.preventDefault();
  93:     evt.dataTransfer.dropEffect = 'copy';
  94: }
  95: 
  96: function PageLoad(evt) {
  97:     var dropFrame = document.getElementById('DropFrame');
  98:     dropFrame.addEventListener('dragover', handleDragOver, false);
  99:     dropFrame.addEventListener('drop', handleFileSelect, false);
 100: }
 101: </script>

画像ファイルの選択は、input type="file" タグ、およびテキストボックスからURL指定できるほか、ファイルをドラッグする方式の3つを用意した。

ファイルをドラッグする処理は、JavaScriptによって実現している。
ドラッグする場所はオブジェクトとして用意し、そのID名をあらかじめ変数 dropFrame に代入しておく。
関数 PageLoad は bodyタグをonLoadするときに実行すること。
(この項おわり)
header