【问题标题】:Passing a UIImage through a CIFilter produces a blank image通过 CIFilter 传递 UIImage 会产生空白图像
【发布时间】:2013-11-23 14:45:44
【问题描述】:

我的应用为所选图像添加了滤镜。该应用程序的工作原理如下:

  1. 从图像选择器中选择图像
  2. 图像作为我的视图控制器的 ivar 加载
  3. 按下按钮将滤镜添加到图像中

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

- (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];

    }    
}

【问题讨论】:

标签: ios objective-c cocoa-touch cifilter ciimage


【解决方案1】:

问题可能在于 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];
    }
}

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

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

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

【讨论】:

  • 不知道为什么投反对票。在发布答案之前,我重现了这个问题并实际测试了上面的代码。
  • 请解释为什么你认为仅仅使用不同的初始化器和方法就可以产生影响。您的代码与 OP 中的代码完全相同,只是分为两个方法调用。此外,简单地展示代码而不做解释并不是一个好的回答方式(即使它是正确的)。
  • 太棒了。很高兴它有帮助!
猜你喜欢
  • 2017-06-23
  • 1970-01-01
  • 2018-01-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-23
  • 2021-11-22
  • 2020-08-27
相关资源
最近更新 更多