“unrecognized selector” when attempting to access CIFilter's outputImage

后端 未结 2 641
轮回少年
轮回少年 2021-01-19 13:04

I\'m experimenting with Core Image (on OS X, 10.7.3) for the first time and am running into a brick wall. I\'m certain this is something silly I\'m doing and just need some

相关标签:
2条回答
  • 2021-01-19 13:36

    I believe your extents are the culprit (however strange it is). When I change the extents to be a CIVector* it works.

    NSURL *imageURL = [NSURL fileURLWithPath:@"/Users/david/Desktop/video.png"];
    CIImage *inputImage = [CIImage imageWithContentsOfURL:imageURL];
    CIFilter *filter = [CIFilter filterWithName:@"CIAreaAverage"];
    [filter setValue:inputImage forKey:kCIInputImageKey];
    CGRect inputExtent = [inputImage extent];
    CIVector *extent = [CIVector vectorWithX:inputExtent.origin.x
                                           Y:inputExtent.origin.y
                                           Z:inputExtent.size.width
                                           W:inputExtent.size.height];
    [filter setValue:extent forKey:kCIInputExtentKey];
    CIImage *outputImage = [filter valueForKey:@"outputImage"];
    

    [inputImage extent] returns an CGRect, but apparently a CIVector* works better.

    0 讨论(0)
  • 2021-01-19 13:46

    Here's how I made CIAreaAverage work in an iOS app:

    CGRect inputExtent = [self.inputImage extent];
    CIVector *extent = [CIVector vectorWithX:inputExtent.origin.x
                                           Y:inputExtent.origin.y
                                           Z:inputExtent.size.width
                                           W:inputExtent.size.height];
    CIImage* inputAverage = [CIFilter filterWithName:@"CIAreaAverage" keysAndValues:@"inputImage", self.inputImage, @"inputExtent", extent, nil].outputImage;
    
    //CIImage* inputAverage = [self.inputImage imageByApplyingFilter:@"CIAreaMinimum" withInputParameters:@{@"inputImage" : inputImage, @"inputExtent" : extent}];
    EAGLContext *myEAGLContext = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2];
    NSDictionary *options = @{ kCIContextWorkingColorSpace : [NSNull null] };
    CIContext *myContext = [CIContext contextWithEAGLContext:myEAGLContext options:options];
    
    size_t rowBytes = 32 ; // ARGB has 4 components
    uint8_t byteBuffer[rowBytes]; // Buffer to render into
    
    [myContext render:inputAverage toBitmap:byteBuffer rowBytes:rowBytes bounds:[inputAverage extent] format:kCIFormatRGBA8 colorSpace:nil];
    
    const uint8_t* pixel = &byteBuffer[0];
    float red   = pixel[0] / 255.0;
    float green = pixel[1] / 255.0;
    float blue  = pixel[2] / 255.0;
    NSLog(@"%f, %f, %f\n", red, green, blue);
    
    
    return outputImage;
    }
    @end
    

    The output will look something like this:

    2015-05-23 15:58:20.935 CIFunHouse[2400:489913] 0.752941, 0.858824, 0.890196
    2015-05-23 15:58:20.981 CIFunHouse[2400:489913] 0.752941, 0.858824, 0.890196
    
    0 讨论(0)
提交回复
热议问题