【Swift】PhotoShopのacvファイルを使って画像にフィルターをかける
iOSには画像系のライブラリで有名なCPUImageあり、これを使えば.acvファイルを使用した画像フィルターが簡単に利用できます。 しかしこの機能を外部のライブラリに頼りたくないので自分で実装してみようと思います。
完成品
トーンカーブを使うには
トーンカーブを使えば画素値の入出力をダイレクトに調整できる。rgb各チャンネルごとに補正をかけることができる。
この入出力の管理と同様のことをlutと呼ばれる画像で再現することができる。
つまり、①acvファイルを解析 ②それを用いてLUTを作成、③LUTを使って画素値を書き換える。
実装
photoshopのacvファイルについてはこちら このカーブはスプライン曲線と呼ばれるもので、GPUImageはスプライン補間を使って再現している。らしいですが正直理解する気もないので、CPUImageから丸パクリします。
ここら辺はcreateLutとかtoneCurveTexureとかgithubで調べれば似たようなのが複数落ちてました。
①普通にやる(1pxごとに書き換える)
オリジナルの画像からピクセルデータの配列を作成して1pxごとに画素値を変更 してそれを使って新しい画像を作成する
まったく問題なく実装できた。がパーフォマンスに自信がない。
②CIKernel
kernel vec4 filterKernel(sampler inputImage, sampler toneCurveTexture) { vec4 textureColor = sample(inputImage,samplerCoord(inputImage)); float redCurveValue = sample(toneCurveTexture, vec2(textureColor.r, 0.5)).r; float greenCurveValue = sample(toneCurveTexture, vec2(textureColor.g, 0.5)).g; float blueCurveValue = sample(toneCurveTexture, vec2(textureColor.b, 0.5)).b; return vec4(vec3(redCurveValue, greenCurveValue, blueCurveValue),textureColor.a); }
0penGLのSLぽくかけるので使ってみたが、若干画像にムラができてしまった。色空間がなんとからしいのだが ③で実装できたので深追いはしていない。
③CIColorCube
CoreImageのフィルターのこれを使う。
結論
最終的に③で実装することになったのLUT画像をPhotoshopで作成し(acvファイルを解析する手間が省ける)、それを読みCIColorCubeで使いました。
ので色々調べましたがこの2つで十分でした。 - https://coherent-labs.com/converting-adobe-photoshop-acv-to-lut-for-color-grading/ - https://qiita.com/Ushio/items/b0a0cb7617ca44c3118d
一応acvファイルを読むコードを載せておきます。半年前のですが・・
感想
インターン先で個人事業主の方に、フォトショップで作成したのacvファイルとGPUImageを使ってフィルターをかけているんだけど、可能な限り内部化したいのでSwiftで実装してほしいと依頼されました。 当初はCGUImageのソースを読んで頭の中に"acvファイルを解析してOpenGLを使う"というイメージを持ちました。
しかし実際にはacvファイルも使用せず、またOpenGLの知識も一切必要ありませんでした。 昔高校の先生に理系の人間はまず前提から疑うとよく言われたのを思い出しました。
にしてもLUTという概念を発見するのに時間がかかりました。githubで類似コードを探しててcreateLutという関数を見つけたのですが、GPUImageではtoneCurveTextureという変数名がLutの配列だった。今回の話でいうと、この変数名にlutという文字があればもっと早く・・