使用CICrop裁剪CIImage无法正常工作

时间:2012-03-07 12:07:37

标签: macos cocoa crop

我遇到了裁剪图像的麻烦。对我来说,CICrop过滤器无法正常工作。如果我的CIVector x和y(原点)为0,一切正常(图像从左下角裁剪),图像被我的矩形宽度和高度裁剪,但如果CIVector原点(x和y)在我的裁剪中不是0图像变成空间(因为CICrop过滤器从左下角裁剪,无论起源是什么(x和y))。

我正在使用矩形

裁剪CIImage
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"];

使用CIVector X 150和Y 150输出图像(为清晰起见,我画了边框)

enter image description here

使用CIVector X 0和Y 0输出图像:

enter image description here

原始图片:

enter image description here

我做错了什么?或者它应该这样做?

3 个答案:

答案 0 :(得分:28)

您确定输出图像是您期望的尺寸吗?你是如何绘制输出图像的?

CICrop过滤器不会缩小原始图片的大小,只会删除您不想要的内容。

要获得您想要的结果,您可能需要这样做:

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

如果您想要实际的CIImage作为输出而不是仅仅绘制它,请执行以下操作:

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"];

答案 1 :(得分:9)

重要的是要注意视图的坐标系是左上角,而CIImage是左下角。如果你在进行这些变换时没有抓住它,这会让你发疯!这篇文章描述了单向转换:Changing CGrect value to user coordinate system

答案 2 :(得分:0)

CICrop的工作方式-裁剪您指定的矩形,未裁剪的区域变为透明。如果您打印extent,将会看到它仍然是原始的矩形。

根据建议,您可以进行翻译。现在在Swift 5中只有1行:

let newImage = myCIImage.transformed(by: CGAffineTransform(translationX: -150, y: -150)