Webといえば便利言語の1つにPHPがある。PHPには画像サポートがあるのだが、その格納場所がファイルしか選択できない。
そこで、PHPを用いて、image変数をDBに格納したり、DBからimage変数に戻したりする方法のご紹介
イメージ変数からDBへ格納する
イメージ変数はたとえば$image = imagecreatefromjpeg("");
や
$image = imagecreatefrompng("");
で生成することができる。
これはこのままではDBに格納するのはつらい。
imagejpeg やimagepngの出力は標準出力のみで変数にしまうことができない。
そこで、
標準出力のキャプチャ関数を使う
ob_start(); //キャプチャ開始
imagejpeg($image);//jpegのレンダリング
$jpegdata = ob_get_contents();//データーの取得
ob_end_clean();//キャプチャ終了
これで、任意のデータをファイルを介すことなく、変数に入れることができた。
あとは、このjpegdataをBLOB等を使いDBに格納するだけである。
プログラムに分岐を付けることで、
jpegファイルを読み込んで、加工してpngにしてDBに保存なども可能になる。
DBから直接image変数を作る
image変数の生成はファイルからしか対応していないのでimage変数をDBから作ろうとすると、一度ファイルに落とすしかない。
しかし、これは、ハンドラーを作ることで回避できる。
stream_wrapper_register
このマニュアルにある
VariableStream を定義してやり
stream_wrapper_register("var", "VariableStream");
のように登録する。
すると、変数をファイルのように読み書きできるようになる。
あとは
たとえば、DBからデータを$jpegdataに取り出したとすると
$image = imagecreatefromjpeg ("var://jpegdata");
のように、変数をファイルのように扱わさせ、imagecreatefromjpeg を使って イメージ変数を作ればよい。
この方法はjpeg以外でも、pngなど他のイメージ変数にも使える。
DBとイメージ変数の連携
上記2つのハックを応用すると、かなりいろいろDBを使って遊べる。特に検索してレンダリング系はファイルシステムを通さなくてもよくなるので便利な事もある。
もっとも、DBに負荷がかかるので、善し悪し
