自定义CIKernel移动像素

时间:2013-04-29 08:10:59

标签: objective-c macos kernel cifilter

我正在尝试创建自定义cifilter(如adobe的warp过滤器)。如何只将几个像素(在ROI中)移动到内核语言中的其他位置?也许有人可以建议我一些关于它的信息?我已经阅读了关于创建自定义cifilter的所有Apple文档,但是没有找到该类型过滤器的内核部分的任何类似示例。有一些CIF过滤器可以做类似的事情(比如CITwirlDistortion,CIBumpDistortion)。也许有一些地方我可以找到他们的内核?

1 个答案:

答案 0 :(得分:4)

你必须反过来这样做。而不是说我想将这些输入像素放在输出中的这个位置,你必须回答这个输出像素输入中像素的问题。

看看这个内核:

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 );
}

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

minX = 100, maxX = 300 and shift = 500

因此效果是您将范围内的像素(minX + shift,maxX + shift)移动到(minX,maxX)