PHPのimagecropautoが便利な話
タイトル読んだらそれで終わりな記事。
前置き(読まなくても良い
(回り道酷いです)
先日、とある理由でLightning - Digital AVアダプタを入手しました。目的の方はいまいちだったのでこれから試行錯誤なのですが、まあそれはそれとして、既存環境と組み合わせることで副産物的にiOSデバイスのHDMIキャプチャが可能となりました。で、そうなると例えばアプリの画面を録画したりも出来る(アプリ側で著作権制御がされていない場合)わけで、P1の端くれ的には画像ダイマに便利な環境が整ったといえるでしょう。
しかし。
アプリ側の対応の問題なのか、自分のやり方が良くないのかは調べきれていない為不明ですが、私の環境(後述)でデレステ2のMV3をキャプチャすると以下のような黒枠のある状態になってしまいます(以下は動画として記録したものから画像を取り出したものです)。
オーバースキャン対策でしょうか?まあ理由は重要ではありません。今大事なのは、個人的にこの黒枠が邪魔ということです。画像処理で消してしまいましょう。
課題設定
- 以下の環境・手順でキャプチャした画像の、上述サンプル画像に現れるような黒縁を画像処理で消去したい
どうすればいい?タイトル読んでください
そこでimagecropautoです。こうします。
<?php $original_image = imagecreatefromjpeg('cute_eternal17_origin.jpg'); $cloped_image=imagecropauto($original_image,IMG_CROP_THRESHOLD,0.5,0); imagejpeg($cloped_image, 'cute_eternal17_crop.jpg'); imagedestroy($cloped_image);
PHP: imagecropauto - Manualを見ると、「この関数は、 現在のところ詳細な情報はありません」と書いてある割にはそれなりに詳細な情報を得ることが出来ます。要は、一定の条件に従って画像の4辺のフチを切り離してくれます。目的や状況によって様々だろうとは思うものの、事実上IMG_CROP_THRESHOLDが一番使い勝手いいと思います。
IMG_CROP_THRESHOLD threshold と color を用いてクロップします。
threshold 画像の色とクロップする色を比較する際に用いる許容誤差を、パーセントで指定します。 色の違いを判断する際には、RGBキューブ内での距離を用います。 IMG_CROP_THRESHOLD モードのときにだけ利用します。 color RGB値あるいはパレットインデックスを指定します。 IMG_CROP_THRESHOLD モードのときにだけ利用します。
完全に黒とわかっている場合ならthresholdは0で良いですが、先述の環境の通りMP4からの切り出しですので、フチはほぼ確実に完全黒ではないと断言できます。どれくらいを設定すべきなのかは状況によりけりでしょうが、例えば今回の例に使った画像の場合0.5%指定で上下に黒い線が1本残っています。その辺許容できるかどうかは用途によるでしょう。
補足:絶対位置指定じゃだめだったのか
もちろん、今回の環境のみであればそれでもいいはずですが、自動的に判定してくれる方が応用幅が広いよねと言うだけ。
ちなみに
私はこれをim@stodonでダイマ4するために使っています。実際にはもっと手を入れて画像をcropして縮小しjpgに保存し直すところまで自動化されており、ファイル容量を削りモバイル環境下の人などにも広く画像が行き渡るようにしつつサーバー負荷を抑える効果があるよう工夫しています。
ところで
サンプル画像に写っているのは、アイドルマスターシンデレラガールズに登場するアイドルの一人、安部菜々さんです。もしデレステなりモバマスなりに触れる機会がありましたら、この永遠の17歳アイドルのウサミンこと安部菜々さんをよろしくお願いします。