MoreBeerMorePower

Power Platform中心だけど、ノーコード/ローコード系を書いてます。

特定のフォルダに入れた写真のサイズを自動でそろえてくれるフローをつくる

はじめに

ブログを書くときにスクリーンショットをたくさん撮って文字入れしたり、切り抜いたりをPowerPointを使ってやっているので、しばしばこんな感じのファイルが生成されます・・・。

f:id:mofumofu_dance:20201006212811p:plain
スライドの枚数としてはもっと多いけど、だいたいこんなファイルができる。

いつも悩むのは写真のサイズで、縦にだけ長いスクショや絵を貼ると下図のようにかなりのスペース(主に高さ)を占有してしまうんですよね。

f:id:mofumofu_dance:20201006213029p:plain
縦に長いスクショを貼った場合のブログ上での表示。

一方で、背景をつけてあげて縦横比を調整すると、いい感じのスペースで収まってくれます。

f:id:mofumofu_dance:20201006213145p:plain
縦横比を、背景を入れて調整した場合

今回はこのような感じに、長い方向の解像度を落とさないようにしながら背景を合成して写真のサイズを整えてくれるフローを紹介します。

フォルダと背景画像の準備

大まかな仕組みとしては下図のとおりです。

f:id:mofumofu_dance:20201006214606p:plain
仕組みの概要

写真の出し入れは何らかのクラウドストレージがよいので、今回はローカルに同期しているOneDriveを採用しました。

特定のフォルダにスクショ/加工済みの画像を保存したことをトリガーとしてフローを実行し、加工済みの写真を出力先のフォルダに保存するため、フォルダを2つ用意しておきます。

用途 パス
一時的な画像置き場 /ImageInput/
加工済み画像置き場 /ImageOutput/

また、適当なサイズの単色塗りつぶしの画像を1枚、/ImageInput/Background.png として置いておきます。この画像を後ほどサイズ調整のための背景として利用します。

処理の流れ

フローは以下のような処理で進みます。

  1. 保存画像と背景画像のコンテンツ取得
  2. 保存画像の解像度取得とアスペクト比の判定
  3. 背景画像のリサイズと保存画像との合成

f:id:mofumofu_dance:20201007001055p:plain
フローの全体

このフローの実行により以下のように画像が変換されました。わかりやすいように背景を黄色にしていますが、期待通り、16:9なサイズに背景付きで正規化されています。

f:id:mofumofu_dance:20201007002507p:plain
フローを通す前後での画像比較

1. 保存画像と背景画像のコンテンツ取得

ここは特に迷うこともないので簡単に。

トリガーではOneDrive for Businessコネクターの「ファイルが作成されたとき」を利用します。

続けて、「ファイルコンテンツの取得」アクションを2つ追加し、いずれか一方にはトリガーの結果得られる「File Identifier」を動的コンテンツから追加、もう一方には背景画像のパスである /ImageInput/Background.png を指定します。

f:id:mofumofu_dance:20201007002817p:plain
保存画像と背景画像のコンテンツ取得

2. 保存画像の解像度取得とアスペクト比の判定

保存画像の解像度は標準のコネクターでは取得できないため、Cloudmersive Image Processing コネクターの「Returns the image metadata including EXIF and resolution」アクションを追加します。

アクションのインプットにはステップ1 で取得した、保存画像のファイルコンテンツを動的コンテンツから追加してください。ファイル名は適当なもので構いません。

次に、保存画像のアスペクト比を判定します。 今回は背景画像と合成して、16:9 な画像を生成したいので、保存画像の「Height」が以下の式を満たすかどうかを条件分岐で判定しています。

[Height] > [Width] × ( 9 ÷ 16) 

もっと一般的には

[Height] > [Width] × ([背景画像の高さ] ÷ [背景画像の幅])

となります。例えば保存画像の高さが1000px, 幅が1600pxの場合には、1000 > 1600 x (9/16) = 900となるので、分岐はTrueになります。(16:9よりも縦に長いアスペクト比だという判定結果)

f:id:mofumofu_dance:20201007003806p:plain
保存画像の解像度取得とアスペクト比での条件分岐

3. 背景画像のリサイズと保存画像との合成

最後に背景画像をリサイズし、保存画像と合成していきます。

ステップ2の分岐の結果がTrue (16:9よりも縦長)の場合には、保存画像の縦に合わせて背景画像をリサイズします。逆に分岐の結果がFalse (16:9よりも横長) の場合には、保存画像の横幅に合わせて背景画像をリサイズしていきます。

これを実現するのが Cloudmersive Image Processingコネクターの「Resize an image while preserving aspect ratio」アクションです。 このアクションではリサイズ時の幅、高さの最大値ともとになる画像を指定します。

f:id:mofumofu_dance:20201007004656p:plain
アスペクト比を保って画像をリサイズするアクション

縦に合わせる場合 (判定がTrue) には、高さの最大値を保存画像の高さに合わせ、一方の幅の最大値は適当に大きな値にしておきます。

逆に、横幅に合わせる場合 (判定がFalse) には、幅の最大値を保存画像の幅に合わせて、高さの最大値を適当な値にセットしておきます。

f:id:mofumofu_dance:20201007005139p:plain
背景画像のリサイズ処理。判定に応じて最大の高さ・幅が異なる点に注意

リサイズがてきたら、あとは分岐のTrue/Falseに共通の合成処理です。これにもCloudmersive Image Processingの「Composite two images together」アクションを使います。

合成位置はcenter で、ベースになる画像 (上から2つ目の入力) には リサイズ後の背景画像を、上から重ねる画像 (上から4つ目の入力) には 最初に取得した保存画像を指定します。

f:id:mofumofu_dance:20201007005748p:plain
画像の合成アクション。centerで背景画像と保存画像を合成する

以上でメインの処理は完了です。適当な名前 (今回はyyyyMMdd_HHmmss.png) をつけて /ImageOutput/に保存します。

f:id:mofumofu_dance:20201007010242p:plain
ステップ3の処理全体。背景画像のリサイズのみ入力が異なるが、ほかは共通処理

おわり

今回はCloudmersiveの Image Processing コネクターを利用してブログを書くときに貼り付ける画像を自動で整えるようなフローを作成しました。

一か所数式が入りましたが、ノーコードな感じでお役立ちフローを作るのにCloudmersiveは非常に有効だと思いますので、ぜひ皆さんも使ってみてください。