ios - 通过 CIFilter 传递 UIImage 会生成空白图像

标签 ios objective-c cocoa-touch cifilter ciimage

我的应用程序向选定的图像添加过滤器。该应用程序的工作原理如下:

  1. 从图像选择器中选择图像
  2. 图像作为我的 View Controller 的 ivar 加载
  3. 按下按钮即可将滤镜添加到图像

当我按下按钮添加滤镜时,主 ImageView 变为全白。但是,当我最初从选择器加载图像时,它显示得很好。这是添加过滤器的代码。

- (IBAction)addFilter:(id)sender {
    if(_imageToFilter)
    {
        CIImage *newImage = _imageToFilter.CIImage;
        CIFilter *myFilter = [CIFilter filterWithName:@"CIColorInvert" keysAndValues:@"inputImage",newImage, nil];
        CIImage *filteredImage = [myFilter outputImage];
        UIImage *outputImage = [UIImage imageWithCIImage:filteredImage];
        [mainImage setImage:outputImage];

    }    
}

最佳答案

问题可能是由于 CIImage *inputImage 被分配了 nil。尝试使用 CIImage 的 initWithImage: 而不是 _imageToFilter.CIImage (更多关于下面的编辑):

-(IBAction)addFilter:(id)sender {
    if(_imageToFilter) {
      CIImage *inputImage = [[CIImage alloc] initWithImage:_imageToFilter];
      CIFilter *myFilter = [CIFilter filterWithName:@"CIColorInvert" keysAndValues:@"inputImage",newImage, nil];
      CIImage *filteredImage = [myFilter outputImage];
      UIImage *outputImage = [UIImage imageWithCIImage:filteredImage];
      [mainImage setImage:outputImage];
    }
}

编辑:根据评论的反馈,问题似乎是 _imageToFilter.CIImage 返回 nil。来自 docs :“如果 UIImage 对象是使用 CGImageRef 初始化的,则该属性的值为 nil。”

使用CIImage初始化方法initWithImage:用UIImage初始化一个CIImage对象,这样就解决了问题。其余代码工作正常,因此我将其返回到原始的 filterWithName:keysAndValues: 以继续关注有问题的部分。更多回复:这里的问题:Could anyone tell me why UIImage.ciimage is null

感谢您的反馈,希望答案对OP有所帮助。

关于ios - 通过 CIFilter 传递 UIImage 会生成空白图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19912458/

相关文章:

iphone - 数组计数抛出异常

ios - iOS网路库建议

ios - 根据 ios 中的标签文本动态定位按钮

ios - 如何在子类上使用方法调配或其他东西

ios - 您可以检索 facetime 通话记录吗?

iphone - 消除模态视图层次结构——一个优雅的解决方案

ios - 向用户打开所有已安装电子邮件客户端的建议

ios - 如何使用 iOS Core Bluetooth 在 BLE 上完全断开连接

android - 一部手机与另一部手机的连接

ios - UILabel 切断了自定义字体。如何根据所选的自定义字体动态调整 UILabel 高度?