Вопрос

I would like to apply a CIGloom filter to an image in my iOS app using the following code:

CIFilter * ciEffectFilter = [CIFilter filterWithName:@"CIGloom"];
[ciEffectFilter setDefaults];
[ciEffectFilter setValue:myimage forKey:@"inputImage"];
[ciEffectFilter setValue:[NSNumber numberWithFloat: 0.75] forKey:@"inputIntensity"];
[ciEffectFilter setValue:[NSNumber numberWithFloat: 20] forKey:@"inputRadius"];

CIImage * outputImage = [filter valueForKey:@"outputImage"];
CGImageRef gimg = [context createCGImage:outputImage fromRect:[outputImage extent]];
UIImage *newImg = [UIImage imageWithCGImage:cgimg];            
CGImageRelease(cgimg);
myImageView.image =  newImg;

but this does not work. It only gives me back a blank image.

When I tried something similar using a CIHueAdjust filter using the following code:

    CIFilter *filter = [CIFilter filterWithName:@"CIHueAdjust"];  
    [filter setDefaults];  
    [filter setValue:foreciImage forKey:@"inputImage"];  
    [filter setValue:[NSNumber numberWithFloat: 3.0f] forKey:@"inputAngle"];  

    CIImage *outputImage = [filter outputImage];
    CGImageRef cgimg = [context createCGImage:outputImage fromRect:[outputImage extent]];
    UIImage *newImg = [UIImage imageWithCGImage:cgimg];    

it ran as expected.

Why doesn't my CIGloom Core Image filter work here?

Это было полезно?

Решение

CIGloom, while present on the Mac's implementation of Core Image, is not in iOS as of 5.0.1. When I run the following query:

NSArray *filterNames = [CIFilter filterNamesInCategory:kCICategoryBuiltIn];

NSLog(@"Built in filters");
for (NSString *currentFilterName in filterNames)
{
    NSLog(@"%@", currentFilterName);
}

which is based on lms' question about blur filters I get the following built-in filters in iOS 5.0.1:

CIAdditionCompositing
CIAffineTransform
CICheckerboardGenerator
CIColorBlendMode
CIColorBurnBlendMode
CIColorControls
CIColorCube
CIColorDodgeBlendMode
CIColorInvert
CIColorMatrix
CIColorMonochrome
CIConstantColorGenerator
CICrop
CIDarkenBlendMode
CIDifferenceBlendMode
CIExclusionBlendMode
CIExposureAdjust
CIFalseColor
CIGammaAdjust
CIGaussianGradient
CIHardLightBlendMode
CIHighlightShadowAdjust
CIHueAdjust
CIHueBlendMode
CILightenBlendMode
CILinearGradient
CILuminosityBlendMode
CIMaximumCompositing
CIMinimumCompositing
CIMultiplyBlendMode
CIMultiplyCompositing
CIOverlayBlendMode
CIRadialGradient
CISaturationBlendMode
CIScreenBlendMode
CISepiaTone
CISoftLightBlendMode
CISourceAtopCompositing
CISourceInCompositing
CISourceOutCompositing
CISourceOverCompositing
CIStraightenFilter
CIStripesGenerator
CITemperatureAndTint
CIToneCurve
CIVibrance
CIVignette
CIWhitePointAdjust

CIGloom is not listed among those, where CIHueAdjust is, which is why the latter worked and the former didn't. You will not be able to perform this filtering operation on iOS using Core Image right now.

However, if you really need to have a filter like this, you could write a custom shader to perform this action using my open source GPUImage framework. I'll probably be adding some blur filters to that over the next few days, but if you need this right now you could write your own filter.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top