iOS自定义CIFilter使用CIKernel时'apply:'方法不可用,求助解决
自定义CIFilter使用CIKernel报错:'apply:'在iOS不可用
问题场景
我正在创建一个实现CIKernel的简单自定义CIFilter,用于降低图像的透明度值,代码如下:
AlphaFilter.h
@interface CIAlphaFilter: CIFilter { CIImage *inputImage; } @property (retain, nonatomic) CIImage *inputImage; @end
AlphaFilter.m
#import "AlphaFilter.h" @implementation CIAlphaFilter @synthesize inputImage; static CIKernel *alphaRemoveKernel = nil; - (id)init { if(alphaRemoveKernel == nil) { NSString *code = @"kernel vec4 darkToTransparent(sampler image){vec4 color = sample(image, samplerCoord(image));color.a =0.5;return color;}"; alphaRemoveKernel = [CIKernel kernelWithString:code]; } return [super init]; } - (CIImage *)outputImage { CISampler *src = [CISampler samplerWithImage: inputImage]; return [self apply: alphaRemoveKernel, src, nil]; // 此处报错 } @end
在outputImage方法的return语句处,Xcode 15.2报错:
'apply:' is unavailable: not available on iOS
错误原因
apply:是macOS专属的API,iOS平台并不支持。iOS上需要使用CIKernel的applyWithExtent:roiCallback:arguments:方法来执行内核逻辑。另外你无需将CIImage转换为CISampler,直接传入CIImage即可满足内核需求。
修正后的代码
AlphaFilter.m 修正版
#import "AlphaFilter.h" @implementation CIAlphaFilter @synthesize inputImage; static CIKernel *alphaRemoveKernel = nil; - (id)init { if(alphaRemoveKernel == nil) { NSString *code = @"kernel vec4 darkToTransparent(sampler image){vec4 color = sample(image, samplerCoord(image));color.a = 0.5;return color;}"; alphaRemoveKernel = [CIKernel kernelWithString:code]; } return [super init]; } - (CIImage *)outputImage { if (!self.inputImage) return nil; // 获取输入图像的处理范围 CGRect extent = self.inputImage.extent; // 使用iOS支持的方法执行内核计算 return [alphaRemoveKernel applyWithExtent:extent roiCallback:^CGRect(int index, CGRect rect) { // 返回当前处理区域,无需扩展范围 return rect; } arguments:@[self.inputImage]]; } @end
关键修改点
- 替换macOS专属的
apply:方法为iOS兼容的applyWithExtent:roiCallback:arguments: - 移除不必要的CISampler转换,直接传入inputImage
- 添加inputImage空值判断,避免空指针异常
- roiCallback返回传入的rect,因为当前内核不需要额外的像素范围
内容的提问来源于stack exchange,提问作者Hoài Vũ Lệ
相关产品推荐
相关产品推荐

