WEBデザイン・開発講義WEB Design&Development Lecture

マルチメディアの画像・動画処理するPHPプログラミング

マルチメディアの画像・動画処理するPHPプログラミング

マルチメディアの画像・動画処理するPHPプログラミングとは

PHPの画像・動画プログラミング概要※画像クリックで拡大表示

※アイコンの機能:表示   実行  ダウンロード

  • 静止画と動画のPHPプログラム編集・保存の概要は、
    静止画と動画のPHPプログラム編集・保存の概要
    1. マルチメディアデータを扱う上で、「静止画」と「動画」に分類されます。
    2. 「静止画」は、「image系」と「draw系」に分類することができます。「image系」を扱うPHP関数やクラスは「ImageMagick」「image」に代表され、「draw系」は「GD」です。デジタルカメラのメタ情報を取得するには、「Exif」があります。
    3. 「動画」は、「映像」と「音声」から構成される「コンテナ」で管理されます。WEBサイトで現在表示できる標準的なコンテナは、「MP4」であり、映像コーディックは、「H.264」で、音声コーディックは「AAC」であり、種々のタイプの入力動画を「MP4」に統一して出力することがベストです。
      映像や音声のコーディック変換は、「FFmpeg」を利用します。表示時間、大きさ、フレーム数、コディック情報などは「ffmpeg-php」を利用します。フレーム画像抽出や、フレームの組合せのアニメーションは「phpvideotoolkit-v2」が良いです。
    4. 「静止画 image系」の編集加工の処理は、「トリミング」「リサイズ」「サムネール画像生成」「画像変換」「画像合成」などが一般的で、「image又はImageMagick」を利用する方が良いです。
    5. 「静止画 draw系」の編集加工の処理は、テキストとボックスなどの描画によるラベル画像やロゴ制作が一般的で、「GD」を利用します。
    6. 「動画」は、事前に「XMedia Recode」(参考資料の参照)などのアプリ・ソフトを利用して「トリミング」「フレーム編集」などを実行した方が格段にスピードアップできます。(PHPプログラミングでは、30秒の映像・音声変換は、5~10分位が目安)
    7. 「動画」の編集加工の処理は、「サムネール画像としてフレーム画像抽出」などが一般的で、「ffmpeg-php」「image」を利用します。
    8. サムネール画像などの小容量の画像は、データベースの「BLOB形式」で保存すると管理が容易となります。DBのBLOB形式のデータ表示する場合は、画像タイプ別に"header('Content-Type: image/jpeg');"のように、「header」関数でコンテンツ指定して、「image」関数の imagejpeg(), imagepng(), imagegif()関数で出力するようにします。

画像をBLOB形式でDB保存するDB設計

  • 画像をBLOB形式でDB保存するため、ER図とDDL作成の内容説明
    メディア画像のBLOB保存:ER図とDDL
    上記のDBテーブル上で画像を保存するカラムタイプを1.6MBまで可能な「MEDIUMBLOB」指定して、静止画のサムネール画像や動画フレーム画像の情報カラムに画像のサイズ、拡張子、ファイル容量を保存してPHPプログラミングで画像の表示コントロールをします。

PHPの画像プログラミング

  • 静止画のimage系のプログラミングは、
    命令/関数説明
    プログラム内容
    Exifによる
    デジタルカメラの「メタ情報」取得
    1. jpg / tiff 画像のメタ情報は、exif_read_data(filepath, sections, ...)関数を利用
    2. sectionごとのキーと値の連想配列で「FILE, COMPUTED, IFD0, THUMBNAIL, EXIF, COMMENT, GPS」等の取得
    「デジタルカメラのメタ情報を取得する」のexif_read_data処理。
    imageによる
    画像の「編集・加工」
    1. 画像の大きさ取得は、getimagesize(filepath)関数を利用
    2. 画像のリサイズは、imagecreatetruecolor() でリサイズの画像リソースを作成して、元画像を imagecreatefromjpeg() で読み込み、imagecopyresized()でリサイズ指定、imagejpeg() でファイル出力
    「画像の大きさ取得とリサイズ」のgetimagesize() imagecopyresized() 処理。
    ImageMagickによる画像の「タイプ変換」
    1. ImageMagickのインスタンス作成は、「new Imagick( filepath )」で、対象のファイル名(filepath)を指定。
    2. 画像タイプ変換は、PHPバージョンを取得して、PHP5.3以降で対応するwriteImageFile() 又は PHP5.2対応のwriteImage()でファイル出力
    「画像タイプ変換:jpg→png」のwriteImageFile() 又は writeImage() 処理。
    ImageMagickによる「サムネール画像サイズ指定のファイル生成」
    1. ImageMagickのインスタンス作成。
    2. サムネール画像サイズ指定と編集は、「thumbnailImage($thumb_width, $thumb_height)」で実行し、画像ファイル出力
    「サムネール画像サイズ指定」のthumbnailImage()とwriteImageFile() 又は writeImage() で画像生成して出力処理。
    ImageMagickによる「画像トリミング処理」
    1. ImageMagickのインスタンス作成。
    2. 画像トリミング編集は、トリミングサイズと開始位置を指定する「cropImage($width, $height, $x, $y)」で実行し、画像ファイル出力
    「画像トリミング処理」のcropImage()とwriteImageFile() 又は writeImage() で画像生成して出力処理。
    ImageMagickによる「画像合成処理」
    1. ベース画像と合成する画像のImageMagickインスタンス作成。
    2. 画像合成編集は、合成する画像のImagickオブジェクトと合成演算子、合成位置を指定する「compositeImage($obj, $composite, $width, $x, $y)」で実行し、画像ファイル出力
    「画像合成処理」のcompositeImage()とwriteImageFile() 又は writeImage() で画像生成して出力処理。
  • ImageMagickによるGravityとOffsetの関係の説明
    北西(NW)、北(N)、北東(NE)、東(E)、中央(C)、西(W)、南西(SW)、南(S)、南東(SE)の9種類のGravity(重心) からのOffset(x軸、y軸)を指定して、座標(0,0)からの開始位置を求めるものです。「画像トリミング処理」と「画像合成処理」のユーザー関数で作成して利用しています。 画像の位置指定:Gravityとoffsetの関係

PHPの画像プログラミング(続き)

  • 静止画のdraw系のプログラミングは、
    命令/関数説明
    プログラム内容
    GDによる
    文字列変換した「ラベル画像」作成
    1. GDによる画像操作は、$img_res = imagecreatetruecolor( $width, $height ) 関数を利用して、領域指定したリソースを最初に作成。
    2. 利用するカラー作成は、imagecolorallocate ( $img_res,$R ,$G ,$B )
      RGBは、カラー値(0 ~ 255) 又は (0x00 ~ 0XFFの16進数)
    3. 背景画像となる矩形をカラーで塗りつぶしは、imagefilledrectangle( $img_res, $x1,$y1 , $x2,$y2 , $color )
      x1,y1 : 開始位置(座標)、x2,y2 : 終了位置(座標)、$color:塗りつぶし色
    4. 画像リソースのコピーは、imagecopy ( $dst_im , $src_im, $dst_x, $dst_y, $src_x, $src_y, $src_w, $src_h )
      dst_im:コピー先の画像リソース、src_im:コピー元の画像リソース、 dst_x:コピー先の x 座標、dst_y:コピー先の y 座標、src_x:コピー元の x 座標、src_y:コピー元の y 座標、src_w:コピー元の幅、src_h:コピー元の高さ
    5. 文字列を画像に書き込むには、PostScriptのTYPE1フォントを除くと3種類あり、TrueTypeフォント利用のimagettftext()、FreeType2フォント利用のimagefttext(()、エンコーディング組み込みフォント利用のimagestring()があります。
      imagettftext( $img_res, $size, $angle, $x, $y, $color, $font, $text )→「size:フォントサイズ、angle:文字方向、x:最初の文字位置、y:フォントのペースライン位置」が良い。
    6. 画像出力及び画像ファイル出力は、拡張子ごとにPNG:imagepng()、JPG:imagejpeg()、GIF:imagegif()の関数を選択します。
    7. 画像リソースの開放は、imagedestroy($img_res)
    背景色の矩形(200x50)を作成して、文字列「CXMedia Site」で3種類のフォント作成方法によりPNG画像、JPG画像とGIF画像を作成する処理。
    GDによる
    「図形画像」作成
    1. 領域指定したリソースを最初に作成し、利用する色を作成します。
    2. 線、矩形、多角形、弧などの線幅を設定します。
      imagesetthickness ( $img_res, $thickness )
      thicknessは、ピクセル単位の線幅
    3. 線引き:imageline()、矩形描画: imagerectangle()、円の塗りつぶし: imagefilledellipse()、楕円描画: imagerectangle()、多角形の塗りつぶしと描画: imagefilledpolygon(), imagepolygon()などを利用します。
    図形画像として、線幅を設定して、線、三角形、矩形を塗りつぶしと描画して、円の塗りつぶしと楕円を描画します。その画像をPNG出力します。

PHPの動画プログラミング

  • 動画のコンテナ変換のプログラミングは、
    「FFmpeg」のPHPのコマンド実行「exec()」又は、「ffmeg.class.php」を利用します。コマンドの利用方法は、ウィキペディア・サイトのFFmpegで解説されていますので参照下さい。
    FFmpeg」は、音声のWAV→MP3変換、動画のAVC→MP4変換やm2ts→MP4変換、WMV→MP4変換、FLV→MP4変換などが簡単にでき、Goolge Chrome、Facebook、Youtube、ニコニコ動画、Twitterなどのオーディオビデオを扱う様々なソフトで利用されています。
    命令/関数説明
    プログラム内容
    FFmpegによる
    動画のコンテナMP4変換
    1. FFmpegクラスからオブジェクト作成:$FFobj = new FFmpeg();
    2. input()メソッドによる入力ファイルを読み込み、コーディック:映像は、vcodec()メソッドで「h264(MP4形式)」にします。音声は、acodec()メソッドを利用('AAC'のパラメータ他)。
    3. 映像のサイズの指定は、size('480x270') のように「幅x高さ」のパラメータを指定したメソッドを利用します。
    4. ファイルの出力は、output()メソッドで出力フォーマット、ready()メソッドで実行となります。
    撮影した動画をHTML5のvideoタグで表示できるMP4形式に変換する処理。
  • 動画の情報とフレーム画像の取得のプログラミングは、
    PHPのextesionに追加した「ffmpeg-php」クラスを利用。video又はaudioファイルを開いてオブジェクトを作成する「ffmpeg_movie ()」とGDImageからフレームオブジェクトを作成する「ffmpeg_frame ()」です。(参考資料の「ffmpeg-php( extension )の仕様一覧の表示」を参照)
    命令/関数説明
    プログラム内容
    ffmpeg-phpクラスによる
    動画の情報とフレーム画像の取得
    1. 動画の情報取得処理のインスタンス生成:$mvobj = new ffmpeg_movie();
    2. 動画の幅と高さや所要時間、フレーム数などの取得情報は、getFrameWidth(), getFrameHeight(), getDuration(), getFrameCount()メソッドにより取得できます。動画のコーディックは、getVideoCodec()(映像)、getAudioCodec()(音声)メソッドを利用します。
    3. フレーム画像のGDリソース作成は、フレームNo指定のgetFrame() を利用し、フレームリソースからtoGDImage()メソッドでGDリソース作成をします。
    4. ファイルの出力は、GD,image関数のImagecreatetruecolor()で空の画像を作り、imagecopyresampled()で縮小画像サイズでGDリソースコピーして、imageJpeg()でJPEGファイル出力となります。
    動画の情報とフレーム画像の取得して、その内容を表示する処理。
  • 画像DB保存(BLOB)と画像表示のプログラミングは、
    静止画のサムネール画像や動画フレーム画像をDB保存して画像管理を容易にします。
    命令/関数説明
    プログラム内容
    画像ファイルからDB保存とDB検索して画像表示
    1. 保存先のパス指定でfile_get_contents()関数を利用して、イメージデータとして読み込みと画像情報編集してDB保存
    2. CGIのgetメソッドで与えられた画像IDから、DB検索して該当する画像形式(拡張子から判断)のコンテンツ出力(header関数利用)をします。
    3. 利用するHTMLドキュメントでは、HTMLタグimgのsrc属性に<img src= "ref_blobData_imageout.php?id=2">のようにDB検索して画像コンテンツ出力するプログラムと連携した画像表示となります。
    ベース画像からサムネール画像として画像編集してBLOB形式のDB保存(MySQLiの手続き型を利用)
    DB検索によるBLOB形式の画像形式(拡張子)合ったコンテンツ出力(header関数)
    DB保存されている画像IDをHTMLタグimgのsrc属性にCGIのgetメソッドで指定して画像表示

PHPプログラミング補足説明

PHPリファレンス

参考資料の表示

pagetopへ