You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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ệ

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 13:50:43