我正致力于创建一个将单个位值嵌入像素的自定义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)!;
我不确定原因是什么,或者是否有更好的解决方案,理想情况下,最终结果是过滤器可以用于使用位值将多个字节嵌入到图像中。
任何帮助都会很棒!