2017-10-19 38 views
0

我已经写在核心形象定制的内核:如何告诉CIKernel产生没有alpha通道的输出图像?

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' 

作为II在回答中指出,VEC3不是有效的返回类型,所以这个想法不起作用。那么,什么呢?

回答

0

根据苹果的文档返回类型必须是A VEC 4,但它并没有成为一个BGRA像素甚至一个像素:

A kernel routine gets called once for each pixel for the destination image. The routine must return a vec4 data type. Although this four-element vector typically contains pixel data, the vector is not required to represent a pixel

来自:Writing Kernels

+0

感谢。我又经历了一遍,它说图像总是在RGB色彩空间中,所以YCbCr不是一种选择,但我不知道是否可以使用RGB,没有Alpha通道。 –

相关问题