2009年07月07日

phpで画像ページを生成する方法

先日弊社がデモ・オープンしたwebサービス『リポマップ』では、
データベースに登録した写真や動画の出力をphpで生成しています。
今回はそのようなページの作り方について簡単に解説しようと思います。


html文書の中に画像を表示したいときは<img>タグのsrc=の後に
画像のアドレスを入れてもってくるわけですが、
その点はphpで出力する時も変わりません。例えば

<img src = "/gazou/seisei.php?num=53" />

のように書けば、/gazou/seisei.phpというphpファイルに
53という数字を渡して画像データを生成することになります。


seisei.phpの中身は

1 <?php

2 $num = $_GET['num'];
3 $image = getImageFromDb($num);

4 header("Content-Type: image/jpeg");
5 print $image;

6 ?>


のような構造になっています。2行目でnumに入っている数字を取り、
3行目でそれをgetImageFromDbという関数に渡してデータベースから
画像データを取ってくるという具合です。


この関数は元から用意されているものではなく、自前で作ることになりますが、
中身の実装は使っているデータベースやライブラリーによって色々なので、
ここでは説明を省略します。


取ってきたデータを画像として出力するポイントは、4行目のheader関数です。
これによって5行目で出力したデータが、
ブラウザにjpeg形式の画像ファイルとして解釈してもらえることになります。
このような、ヘッダーで指定するContent-TypeのことをMIMEタイプと言います。



ここで注意ですが、上のseisei.phpのデバッグ等をしていて、

print $num;
 

のような行があったとすると、
もうそれだけで何も出力されなくなってしまうことがあります。
これは、ヘッダーで jpeg と指定しているために、
文字列まで画像と解釈して壊れた画像を出力してしまうことが原因です。
テキストの出力なら問題がないので、単純な割に見つけにくいバグだと
思いますので注意してください(私は二度ハマりました)。



リポマップではムービーの投稿もできるのですが、
動画の出力では<img>タグは使えません。
代わりに以下のようなタグを使って張り付けます。

<object classid="clsid:02BF25D5-8C17-4B23-BC80-D3488ABDDC6B"
codebase="http://www.apple.com/qtactivex/qtplugin.cab">
	<param name="src" value='/douga/seisei.php?num=78'>
	<EMBED src='/douga/seisei.php?num=78' autoplay="true"
controller="false" pluginspage="http://www.apple.com/quicktime/download/">
	</EMBED>
</object>


何かとおまじない的な部分が多いのですが、
読み込み先のアドレスは3、4行目の2カ所で、
あとは必要な宣言とオプションです。
オプションの種類はgoogle等で検索すると色々出てきます。
<EMBED>というタグはHTMLの規約には取り入れられていませんが、
IEなどで表示するときに必要になります。


seisei.phpの中身は基本的に画像の時と同様ですが、ヘッダーは


header('Content-Type: video/3gpp');


のように出力する形式に合わせて変わります(3gppはdocomo携帯対応の動画ファイル形式です)。



ラベル:leopard
posted by ラクサス at 18:40| Comment(0) | TrackBack(0) | 【プログラミング】PHP編 | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

※ブログオーナーが承認したコメントのみ表示されます。

この記事へのトラックバック
×

この広告は180日以上新しい記事の投稿がないブログに表示されております。