Cropping CIImage with CICrop isn't working properly

Justin Boo picture Justin Boo · Mar 7, 2012 · Viewed 10.4k times · Source

I'm having troubles cropping image. For me CICrop filter is not working properly. If my CIVector x and y (origins) are 0 everything working fine (image is cropped from left bottom corner), image is cropped by my rectangle width and height, but if CIVector origins (x and y) aren't 0 in my cropped image becomes space (because CICrop filter cropping from bottom left corner no matter what origins (x and y) are).

I'm cropping CIImage with rectangle, source:

CIVector *cropRect =[CIVector vectorWithX:150 Y:150 Z: 300 W: 300];

CIFilter *cropFilter = [CIFilter filterWithName:@"CICrop"];   

[cropFilter setValue:myCIImage forKey:@"inputImage"];
[cropFilter setValue:cropRect forKey:@"inputRectangle"];

CIImage *croppedImage = [cropFilter valueForKey:@"outputImage"];

Output Image with CIVector X 150 and Y 150: (I drawn the border for clarity)

enter image description here

Output Image with CIVector X 0 and Y 0:

enter image description here

Original Image:

enter image description here

What I'm doing wrong? Or is it supposed to do this?

Answer

Rob Keniger picture Rob Keniger · Mar 11, 2012

Are you sure the output image is the size you are expecting? How are you drawing the output image?

The CICrop filter does not reduce the size of the original image, it just blanks out the content you don't want.

To get the result you want you probably need to just do this:

[image drawAtPoint:NSZeroPoint fromRect:NSMakeRect(150, 150, 300, 300) operation:NSCompositeSourceOver fraction:1.0];

If you want an actual CIImage as output rather than just drawing it, just do this:

CIImage* croppedImage = [image imageByCroppingToRect:CGRectMake(150, 150, 300, 300)];

//you also need to translate the origin   
CIFilter* transform = [CIFilter filterWithName:@"CIAffineTransform"];
NSAffineTransform* affineTransform = [NSAffineTransform transform];
[affineTransform translateXBy:-150.0 yBy:-150.0];
[transform setValue:affineTransform forKey:@"inputTransform"];
[transform setValue:croppedImage forKey:@"inputImage"];
CIImage* transformedImage = [transform valueForKey:@"outputImage"];