如何告诉CIKernel生成没有alpha通道的输出图像?

时间:2017-10-19 16:12:56

标签: ios core-image cifilter color-space cikernel

我在Core Image中编写了一个自定义内核:

outputImage = kernel.apply(extent: extent,
                           roiCallback: roiCallback,
                           arguments: [inputImage])!

static let kernel = CIKernel(source:"""
kernel vec4 process(sampler src) {
  vec4 pixel = sample(src, samplerTransform(destCoord()));
  return pixel;
}   
""")!

(这是一个简单的无操作内核,不是实际内容。)

输入是BGRA,但我希望输出CIImage为BGR(或RGB或任何其他顺序)。这可能吗?

我想这样做的原因是输入图像中的所有alpha值都是1,所以我不想浪费内存(和处理时间)在输出图像中存储数百万个1,如果可以的话跳过它。我的代码对性能敏感,并且工作速度不够快,所以我正在寻找优化它的方法。

如果重要,我的目标是iOS 11及更高版本。

我尝试将代码更改为:

kernel vec3 process(sampler src) {
  vec3 pixel = sample(src, samplerTransform(destCoord())).xyz;
  return pixel;
}

但是我收到了一个错误:

invalid kernel return type; valid types are 'vec2' and 'vec4' 

正如我在答案中指出的那样,vec3不是有效的返回类型,所以这个想法不起作用。那怎么了?

1 个答案:

答案 0 :(得分:0)

根据Apple文档,返回类型必须是vec 4,但它不必是BGRA像素甚至是像素:

  

为目标映像的每个像素调用一次内核例程。例程必须返回vec4数据类型。虽然这个四元素矢量通常包含像素数据,但矢量不需要表示像素

来自:Writing Kernels