我在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'
正如 I-I 在回答中指出的那样,vec3 不是一个有效的返回类型,所以这个想法不起作用。那怎么办呢?
根据Apple文档,返回类型必须是vec 4,但它不必是BGRA像素甚至像素:
内核例程为目标图像的每个像素调用一次。例程必须返回 vec4 数据类型。尽管此四元素向量通常包含像素数据,但该向量不需要表示像素
来自: 编写内核