にっきダイアリー

はてなダイアリーからはてなblogに移動してみました。

データスキームを使って画像ファイルを埋め込んだimgタグを作成するクラス

以前途中まで書いて放置してたスクリプトをクラス化してみた。
あとjpeg決め打ちだったところをちゃんとファイルフォーマット調べるようにした。
キャッシュが古かったら作り直すようにした。
例外なげるのは面倒くさいのでやめた。

<?php
// base64でエンコードした画像データをIMGタグの中に埋め込んで返す
// 参考 : http://en.wikipedia.org/wiki/Data_URI_scheme

if(!defined('THUMB_CACHE_EXT')) define('THUMB_CACHE_EXT','.b64'); // キャッシュにくっつける拡張子
if(!defined('THUMB_DIR')) define('THUMB_DIR',''); // サムネールがあるディレクトリ
if(!defined('THUMB_CACHE_DIR')) define('THUMB_CACHE_DIR',''); // キャッシュを保存するディレクトリ

class DScheme {
	// データスキームキャッシュを取得
	function get_thumb_cache($tfile, $odir='', $cdir=''){
		if(!$odir) $odir = THUMB_DIR;
		if(!$cdir) $cdir = THUMB_CACHE_DIR;
		$ofile = $odir.$tfile;
		$cfile = $cdir.$tfile.THUMB_CACHE_EXT;
		$cache = NULL;
		if(file_exists($ofile)){
			$osize = getimagesize($ofile);
			if(file_exists($cfile)){
				// キャッシュの更新タイム確認
				$ostat = stat($ofile);
				$cstat = stat($cfile);
				if($cstat['mtime'] > $ostat['mtime']){
					$cache = file_get_contents($cfile);
				}
				else{
					$this->delete_thumb_cache($tfile, $cdir);
				}
			}
			if(!$cache){ // キャッシュ作成
				$cache = $this->make_thumb_cache($ofile, $cfile, $osize['mime']);
			}
		}
		return $cache;
	}

	function make_thumb_cache($ofile, $cfile, $mime){
		$bin = file_get_contents($ofile);
		$txt = base64_encode($bin);
		$cache = '';
		if($txt){
			$cache = 'data:'.$mime.';base64,'.$txt;
			fwrite(fopen($cfile, "w"), $cache, strlen($cache)); // cache保存
		}
		return $cache;
	}
	// データスキーム化したimgタグを取得
	function get_thumb_itag($tfile, $alt='', $odir='', $cdir=''){
		$itag = NULL;
		$cache = get_thumb_cache($tfile, $odir='', $cdir='');
		if($cache){
			$itag = '<img src="'.$cache.'" alt="' . $alt . '" />';
		}
		return $itag;
	}
	
	// 指定のキャッシュ削除
	function delete_thumb_cache($tfile,$cdir=''){
		if(!$cdir) $cdir = THUMB_CACHE_DIR;
		$cfile = $cdir.$tfile.THUMB_CACHE_EXT;
		unlink($cfile);
	}
}
?>
<?php 
$d = new DScheme();
echo $->get_thumb_itag('sample.jpg');
?>