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

Jus*_*Boo 14 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"];
Run Code Online (Sandbox Code Playgroud)

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

在此输入图像描述

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

在此输入图像描述

原始图片:

在此输入图像描述

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

Rob*_*ger 28

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

CICrop过滤器不降低原有图像的大小,它只是清空了你不想要的内容.

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

[image drawAtPoint:NSZeroPoint fromRect:NSMakeRect(150, 150, 300, 300) operation:NSCompositeSourceOver fraction:1.0];
Run Code Online (Sandbox Code Playgroud)

如果你想要一个实际的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"];
Run Code Online (Sandbox Code Playgroud)


小智 9

重要的是要注意视图的坐标系是左上角,而CIImage是左下角.如果你在进行这些变换时没有抓住它,这会让你发疯!这篇文章描述了单向转换:将CGrect值更改为用户坐标系.