pythonでスライドムービー生成プログラム

カテゴリ:Pythonの話

公開日:2020.07.07 最終更新日:2020.09.08
このエントリーをはてなブックマークに追加

こんにちは。inglowの開発担当です。
今回は、近年超キテる「python」を使って、複数の写真からスライドショーを生成するプログラムを作成してみました

開発環境は下記です。

  • バージョン:python3.8.3
  • エディタ:notepad++

今回作るもの

今回は、フォルダにまとめた写真からスライドショームービーを自動で生成するプログラムを作っていきたいと思います。大まかな仕様は下記のような感じです。

  • 「photos」フォルダに入っている写真をフェードイン→3秒表示→フェードアウトのような動画にする
  • 写真と同じファイル名のテキストファイルがあれば、その内容を写真に表示する(「img_001.jpg」だったら、「img_001.txt」があればこの内容を写真に表示する)
    今回は、「あんずもじ」というフォントを使わせていただきました。
  • exifデータを読み取って、撮影日を写真に表示する

という感じです。画像をリサイズしたり、文字を入れるために、「openCV」や「Pillow」といったライブラリを駆使していきます。
各処理を順番に作成していきます。

写真画像の加工その1 -リサイズする-

まずは、「photos」フォルダの中の写真ファイルを取得します。
「glob.glob()」関数で指定したフォルダの中のファイルパスを取得することができますので、取得します。

末尾を、「*.[拡張子]」とすることで、指定した拡張子のファイル一覧のみ取得することができます。
まずは、取得されたパスを順番に処理するプログラムを書きます

今回の動画サイズは、「854×480」の動画を生成していきます。これより大きい写真の場合はリサイズする必要がありますが、縦向きの写真と横向きの写真が混ざっているため、横長の写真の場合は、横を合わせて、縦長の写真の場合は縦を合わせるようにリサイズする必要があります。また、写真のサイズが、生成しようとしている動画サイズよりも小さい場合はリサイズしません。これをプログラムで書いていきます

写真画像の加工その2 -exif情報を取得する-

スマホで撮影した写真や、GPS等が搭載されているデジタルカメラ等で写真を撮影すると、その時の位置情報や撮影時間が写真データの中に記録されます。これをExifデータといいます。(自分は「イグジフ」と呼んでいます。)
これらが記録されているためスマホで撮影された写真をSNS等にアップする際には気をつけましょうという話をよく聞きます。(みなさん注意しましょう!)
今回は自分が撮影した写真なので躊躇なくexif情報を抽出します。

直接「キー->値」という形で入っているわけではなく、キーはタグのIDになっているため、タグのIDに対して、何のデータが入っているかを生成しなおして、利用しやすくしています。今回は撮影時間が欲しかったので、「’DateTimeOriginal’」キーからデータを取得しました。

写真画像の加工その3 -テキストファイルのテキストを合成する-

写真と同じファイル名のテキストファイルが存在していたら、そのファイル内の文字を写真に入れる処理を作ります。前項で取得した撮影日時の次の行に入れていきます。

写真に入れる文字が生成できたら、写真に合成していきます。
写真への文字入れのイメージは、文字入れ用のレイヤーを作成し文字を描画して、写真と合わせるといったイメージになります。また、写真は「JPEG」のため、透過情報を持っていません。読み込む際に、「RGBA」モードで読み込む必要があります。

ここまでが、写真の文字入れやリサイズの処理になります。加工した写真は、一時ファイルとして、いったん「tmp」フォルダへ保存します。
画像を読み取り、加工して保存する処理の全容は下記のような感じになります

動画のフレーム画像の生成

動画にしたい画像ができたところで、次は、フレーム画像の生成をしていきます。
まず、動画の仕組みからですが、ぱらぱら漫画のように、少しずつ変化している画像を連続で流すことで動画になります。ここでは、この「ぱらぱら漫画」の1枚ずつの画像(フレーム)を生成していきます。まずは、1枚の写真で必要なフレーム数を計算します。
動画の流れとしては、1枚の写真を
フェードイン(0.5秒)→画像表示(3秒)→フェードアウト(0.5秒)
と表示して次の写真へ…という流れになります。また、フェードアウトが何フレーム目からはじまったらいいかも必要になります。これらはpythonに計算してもらいましょう

次に、フェードイン・フェードアウトをする際に、1フレームあたりいくつずつ透明度が変化すればいいのか計算します。今回、0.5秒かけてフェードをするので、30フレームかけて、0→255になるようにします

ここまで書けたら、あとは、写真1枚ずつからフレーム画像を生成していきます。「tmp」フォルダ内の写真を読み取り、各写真の動画用フレーム画像を順番に生成します

画像を動画にする

ここまでこればあと一息です!
先ほどのフレーム画像生成処理の中に、動画生成処理を組み込んでいきます。動画生成処理を組み込んだフレーム生成処理の全容は下記のような感じになります

完成

このプログラムによって生成された動画を掲載します。

ちなみに、「photos」フォルダの中身は写真のような感じになっています。

さいごに

「動画を生成する」と聞くと、とても特殊で難しいことのように感じますが、(実際自分もどうやるの…とか思ってました…)一つずつ仕組みを調べ、実現するための関数等を調べていくと実はそこまで難しいことはないのだなと思いました!これらを応用してもっと何かつくれないかなとわくわくします。

一覧へ戻る