FF14の画像をバッチで画質処理+コピーライトの貼り付けしたい

文中の画像の権利表記:Copyright (C) 2010 – 2018 SQUARE ENIX CO., LTD. All Rights Reserved.

日記書くの二年ぶりだって。まじか。
ちょっと開発してるやつあるんで作業メモ。

やりたいこと:

  • たくさん画像あるやつを一律で補正して、固定イメージはっつけて別名で保存したい
  • 素材の画像をバッチに食わせて、別名で新しい画像を得たい
  • 要はFF14の画像を大量に画質処理+コピーライトの貼り付けしたい
  • 年が変わるとコピーライトの年表示が変わるから、繰り返し生成しなおすことを視野に入れたい

ふだんFireworksつかう(Photoshopはもう完全に使い方忘れた。かつては仕事道具だったのに)のだけど、こいつがバッチ処理みたいな機能ある。これつかって楽できんかと思ったけども、せいぜいサブネイル作るくらいのしょっぱい代物で話にならない。
もういい、画像ライブラリ振り回してなんかできるじゃろ、数学得意じゃないけどトーンカーブもなんとかなるじゃろということで。

Jupyter notebookで実験

とりあえずJupyterNotebook起動して、Pillowとかいろいろ読み込んどく

import os
from PIL import Image
import numpy as np
import matplotlib.pyplot as plt

はりさんの画像を読み込んでみる。

いいんじゃないすか。上のはりさんはスクリーンショットを切り取って小さくしただけのもので、補正やらは一切なし。暗い屋内だわくすんでるわ、ぱっとしない。

ほんではどっかから拾ってきたサインカーブ作るやつをplotで描かせてみる。
やっべグラフとか描いちゃってかっけえ。理数系ってこういうの鼻歌でやるんじゃろかっけえ。

ともかく、各ピクセルにこいつを食わせると暗い色をより暗く、明るい色をより明るくしてメリハリが付く。

ほんとはカーブの具合を上みたいな感じのカーブにいじりたいが、式の書き方がわかんないのでいったんこれで。拙速がだいじ。
さしあたり効率やらノウハウやらわかんないので、愚直に各ピクセルのRGB値を変換していく。

後ろの照明がぱっと明るくなってたり、はりさんの顔にあたってる明かりが明るくなってたり。フィルタはちゃんとかかったということで進める。

次、コピーライト画像を読み込む。
これを読み込んで、画像(今回ははりさんの画像)の、所定の位置にコピーライトを貼り付けたい。
ちょっと困ってるのが、元の画像ったらわりと大きめのマージンがあること。このマージンがだいぶ邪魔なので、ほんとは空白部分をトリムしたい。
cropでうまくいくとあったんだが、正確に0でないピクセルがありそうな気配でtrimかかんない。
一旦いいや。実際やるときはマージン分をいいぐあいに調整して貼り付けちゃおう。

はりさん画像とコピーライト画像のサイズを取得して、はりさん画像のどの座標にコピーライト画像を貼り付けたらいいかを調べる。テキトウにpaste_pos関数作っておこう。2つの画像をあげると、どの座標に描いたらいいかを返すやつ。横0縦184ピクセルのとこに貼り付けたらいいとわかった。

Image.pasteにコピーライト画像、貼り付け先の座標を渡す。引数のmaskにもコピーライト画像をわたしてるのは、これでアルファチャンネルをよしなにしてくれるとのことで。
上のサンプルではコピーライト画像のほうが横幅が大きいけれども、溢れたぶんはなくなる。
実際にこの仕掛けを利用するときはもっと大きな画像を使うことになるので、横幅あふれた―とかは実際には発生しないので、気にしないでよい。

だいたい実験が完了したので、これをバッチスクリプトとしてまとめたら終わり。
いままで画像処理やること少なかったわ、式わたして数値の変換するなんてこともやったことなかったわで、若干進歩。プログラミングのための線形代数買ってあるのに積んでるんだよなー

そのうち読もう。こういうのに役立つ何かが書いてあるかも。