在CIKernel中为自定义CIFilter更新单个像素值

时间:2016-02-24 14:30:56

标签: ios swift opengl-es core-image cifilter

我正致力于创建一个将单个位值嵌入像素的自定义CIKernel。最初的想法是通过一个位数组并将它们嵌入像素中,但由于不支持数组,我不得不尝试不同的方法。

粗略的想法是,对于内核,我会给它一个坐标为(x,y),值为1或0.例程只会将值嵌入到像素中(比如将r值向上移动1)如果为特定坐标,则为0或0。

我一直在尝试用石英作曲家研究它,并提出了这个

kernel vec4 adjustPixelValue(sampler image, float embeddedByte, vec2 coord)
{
    vec2 coord = samplerTransform(image, coord);
    vec2 curCor = destCoord();
    vec2 diff = curCor - coord; 
    float dist = length(diff);

    vec4 cur1 = sample(image, coord);
    cur1.r = cur1.r + embeddedByte;
    vec4 cur = sample(image, samplerCoord(image));

    return mix(cur1, cur, clamp(dist-1.0, 0.0, 1.0));
}

在石英作曲家中获得所需效果,但在应用程序中运行内核时却没有。要做到这一点,我使用

    let xcoord : CGFloat = 400;
    let ycoord : CGFloat = 400;
    let dod  = image.extent;
    var args = [image as AnyObject];
    args.append(Int(1) as AnyObject);
    args.append(CIVector(CGPoint: CGPoint(x: xcoord, y: ycoord)));
    return kernel!.applyWithExtent(dod, roiCallback: {(n : Int32, rect: CGRect) -> CGRect in return rect; }, arguments: args)!;

我不确定原因是什么,或者是否有更好的解决方案,理想情况下,最终结果是过滤器可以用于使用位值将多个字节嵌入到图像中。

任何帮助都会很棒!

0 个答案:

没有答案