【问题标题】:Objective C: CIFilter returning nil image目标 C:CIFilter 返回 nil 图像
【发布时间】:2016-12-25 23:26:41
【问题描述】:

我正在编写一个函数,它将对图像应用过滤器并返回新图像。我写了以下代码:

+ (UIImage*)applyFilter:(UIImage*) photo {
    CIImage *image = [[CIImage alloc] initWithCGImage:photo.CGImage];
    CIFilter *filter = [CIFilter filterWithName:@"CIphotoEffectTransfer"
                                  keysAndValues: kCIInputImageKey, image,
                        @"inputIntensity", @0.8, nil];
    CIImage *outputImage = [filter outputImage];

    UIImage* newPhoto = [self imageFromCIImage:outputImage];
    return newPhoto;
}

我遇到的问题是该函数返回的是一张零照片,而不是应用了过滤器的照片。有趣的是,如果我将过滤器名称更改为 @"CIVignetteEffect" 它将起作用。我不明白为什么一个过滤器有效,而另一个无效。我从以下链接中找到了两个过滤器:https://developer.apple.com/library/tvos/documentation/GraphicsImaging/Reference/CoreImageFilterReference/index.html#//apple_ref/doc/filter/ci/CIPhotoEffectTransfer

【问题讨论】:

    标签: ios objective-c core-image cifilter


    【解决方案1】:

    我相信滤镜的正确名称是 CIPhotoEffectTransfer,而不是 CIphotoeffectTransfer。

    试试这个代码...我过去曾用它来过滤照片,所以我知道它可以工作:

    + (UIImage*)applyFilter:(UIImage*) photo {
    UIImageOrientation orientation = photo.imageOrientation;
    CIImage* image = [CIImage imageWithCGImage:photo.CGImage];
    CIContext *context = [CIContext contextWithOptions:nil];
    CIFilter *filter = [CIFilter filterWithName:@"CIPhotoEffectTransfer"];
    [filter setValue:image forKey:kCIInputImageKey];
    CIImage *outputImage = [filter outputImage];
    CGImageRef cgimg = [context createCGImage:outputImage fromRect:[outputImage extent]];
    UIImage *newPhoto = [UIImage imageWithCGImage:cgimg scale:1.0 orientation:orientation];
    CGImageRelease(cgimg);
    context = nil;
    return newPhoto;
    

    }

    【讨论】:

    • 啊,这很有道理...我修正了错字,但我仍然得到一个 nil 图像。你对还有什么问题有什么想法吗?
    【解决方案2】:

    试试这个,

    我们已经实现了CIFilter效果,

           //CIVignette Effect 
    
            CIContext *imageContext = [CIContext contextWithOptions:nil];
            CIImage *image = [[CIImage alloc] initWithImage:inputimage];
    
            CIFilter *vignette = [CIFilter filterWithName:@"CIVignette"];
            [vignette setDefaults];
            [vignette setValue: image forKey: @"inputImage"];
            [vignette setValue: [NSNumber numberWithFloat: 1.0] forKey: @"inputIntensity"];
            [vignette setValue: [NSNumber numberWithFloat: 10.00 ] forKey: @"inputRadius"];
             CIImage *result = [vignette valueForKey: @"outputImage"];
            CGImageRef cgImageRef = [imageContext createCGImage:result fromRect:[result extent]];
            UIImage *targetImage = [UIImage imageWithCGImage:cgImageRef];
    

    多重效果的详细实现可以参考这个GitHub项目文件ImageFilter

    希望这个答案对某些人有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-05-05
      • 2023-04-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-19
      • 1970-01-01
      • 2021-02-24
      相关资源
      最近更新 更多