How do I perform a fast pixellation filter on an image?

后端 未结 6 544
心在旅途
心在旅途 2020-12-05 03:46

I have a little problem with my pixellation image processing algorithm.

I load the image from the beginning into an array of type unsigned char* After t

6条回答
  •  暗喜
    暗喜 (楼主)
    2020-12-05 04:16

    How about the use the Core Image filter named CIPixellate? Here is a code snippet of how i implemented it. You can play with kCIInputScaleKey to get the intensity you want:

    // initialize context and image
    CIContext *context = [CIContext contextWithOptions:nil];
    CIImage *logo = [CIImage imageWithData:UIImagePNGRepresentation([UIImage imageNamed:@"test"])];
    
    // set filter and properties
    CIFilter *filter = [CIFilter filterWithName:@"CIPixellate"];
    [filter setValue:logo forKey:kCIInputImageKey];
    [filter setValue:[[CIVector alloc] initWithX:150 Y:150] forKey:kCIInputCenterKey]; // default: 150, 150
    [filter setValue:[NSNumber numberWithDouble:100.0] forKey:kCIInputScaleKey]; // default: 8.0
    
    // render image
    CIImage *result = (CIImage *) [filter valueForKey:kCIOutputImageKey];
    CGRect extent = result.extent;
    CGImageRef cgImage = [context createCGImage:result fromRect:extent];
    
    // result
    UIImage *image = [[UIImage alloc] initWithCGImage:cgImage];
    

    Here is the official Apple Filter Tutorial and a List of available Filters.

    Update #1

    I just wrote a method to execute the rendering work in background:

    - (void) pixelateImage:(UIImage *) image withIntensity:(NSNumber *) intensity completionHander:(void (^)(UIImage *pixelatedImage)) handler {
    
        // async task
        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    
            // initialize context and image
            CIContext *context = [CIContext contextWithOptions:nil];
            CIImage *logo = [CIImage imageWithData:UIImagePNGRepresentation(image)];
    
            // set filter and properties
            CIFilter *filter = [CIFilter filterWithName:@"CIPixellate"];
            [filter setValue:logo forKey:kCIInputImageKey];
            [filter setValue:[[CIVector alloc] initWithX:150 Y:150] forKey:kCIInputCenterKey]; // default: 150, 150
            [filter setValue:intensity forKey:kCIInputScaleKey]; // default: 8.0
    
            // render image
            CIImage *result = (CIImage *) [filter valueForKey:kCIOutputImageKey];
            CGRect extent = result.extent;
            CGImageRef cgImage = [context createCGImage:result fromRect:extent];
    
            // result
            UIImage *image = [[UIImage alloc] initWithCGImage:cgImage];
    
            // dispatch to main thread
            dispatch_async(dispatch_get_main_queue(), ^{
                handler(image);
            });
        });
    }
    

    Call it like this:

    [self pixelateImage:[UIImage imageNamed:@"test"] withIntensity:[NSNumber numberWithDouble:100.0] completionHander:^(UIImage *pixelatedImage) {
        self.logoImageView.image = pixelatedImage;
    }];
    

提交回复
热议问题