自定义CIKernel移动像素

hoc*_*man 2 macos kernel objective-c cifilter

我正在尝试创建自定义cifilter(如adobe的warp过滤器)。如何以内核语言仅将几个像素(在ROI中)移动到其他位置?也许有人可以建议我一些相关信息?我已经阅读了有关创建自定义cifilter的所有Apple文档,但尚未找到该类型过滤器内核部分的任何类似示例。有一些CIFilter可以执行类似的操作(例如CITwirlDistortion,CIBumpDistortion)。也许在某个地方可以找到他们的内核?

Sve*_*ven 5

您必须反向执行此操作。不必说我想将这些输入像素放置在输出中的此位置,而是必须回答以下问题:该输出像素的输入中的像素在哪里。

看一下这个内核:

kernel vec4 coreImageKernel(sampler image, float minX, float maxX, float shift)
{
    vec2 coord = samplerCoord( image );

    float x = coord.x;
    float inRange = compare( minX - x, compare( x - maxX, 1., 0. ), 0. );
    coord.x = coord.x + inRange * shift;
    return sample( image, coord );
}
Run Code Online (Sandbox Code Playgroud)

它将minX和maxX之间的垂直条纹替换为向右移动像素的图像内容。如果将此内核与minX = 100,maxX = 300和shift = 500一起使用,则会在左下角显示图像。原稿在右上角。

minX = 100,maxX = 300和shift = 500

因此,效果是将像素范围(minX + shift,maxX + shift)移至(minX,maxX)