簡體   English   中英

目標C:CIFilter返回無圖像

[英]Objective C: CIFilter returning nil image

我正在編寫一個函數,該函數將對圖像應用過濾器並返回新圖像。 我寫了以下代碼:

+ (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;
}

我遇到的問題是該函數返回的是nil照片,而不是應用了濾鏡的照片。 有趣的是,如果我將過濾器名稱更改為@“ CIVignetteEffect”,它將起作用。 我不明白為什么一個過濾器有效,而另一個過濾器無效。 我從以下鏈接中找到了兩個過濾器: https : //developer.apple.com/library/tvos/documentation/GraphicsImaging/Reference/CoreImageFilterReference/index.html#//apple_ref/doc/filter/ci/CIPhotoEffectTransfer

我相信過濾器的正確名稱是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;

}

嘗試這個 ,

我們已經實現了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。

希望這樣的答案會有所幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM