Core Imageフィルタで平行移動がしたい

考えたけどできなかったという話。

Core Imageフィルタで平行移動がしたい


こういう画像から

こういう画像を作りたい。

フィルタでできると何がうれしいの?

平行移動した画像を別のフィルタの入力にできる。
普通に平行移動すると、

[ciContext drawImage:image atPoint:offset/* 平行移動 */ fromRect:contextRect];

こんな感じになっちゃって、平行移動済みの画像をあれこれできない。
glReadPixelsとかで読み戻せばできるけど、パフォーマンスがすごく悪くなる。

アフィン変換フィルタで平行移動できそう。でもできない。

CIAffineTransformっていう画像にアフィン変換を施すCore Imageフィルタがあるけど、これは拡大縮小と回転しかできない。

負の方向にクロップするとできそう。でもできない。

CICropフィルタの入力に負の値を与えるとそれっぽい画像を返してくれる。でもこっちが想定しているスケールにならない。

いちどNSImageに変換すればできる。

CIImageをNSImageとかに変換して平行移動してCIImageに戻せばできる。でもいちいちメインメモリに読み戻すのはパフォーマンス的にNG。

自分でCore Imageフィルタを書けばできる。

当たり前だけどできる。でも、よくよく考えたら処理にほとんど必要ないピクセルのためにVRAMを食いつぶすのはよくないよね。

わかったこと

Core Imageフィルタで平行移動しようとしてはいけない。