2

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

4

1 回答 1

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

它将 minX 和 maxX 之间的垂直条纹替换为向右移动像素的图像内容。在 minX = 100、maxX = 300 和 shift = 500 的情况下使用这个内核会得到左下角的图像。原件在右上角。

minX = 100,maxX = 300 和 shift = 500

所以效果是你将范围内的像素移动 (minX + shift, maxX + shift) 到 (minX, maxX)

于 2013-05-04T10:51:56.153 回答