我遇到了裁剪图像的麻烦。对我来说,CICrop过滤器无法正常工作。如果我的CIVector x和y(原点)为0,一切正常(图像从左下角裁剪),图像被我的矩形宽度和高度裁剪,但如果CIVector原点(x和y)在我的裁剪中不是0图像变成空间(因为CICrop过滤器从左下角裁剪,无论起源是什么(x和y))。
我正在使用矩形源:
裁剪CIImageCIVector *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输出图像(为清晰起见,我画了边框)
使用CIVector X 0和Y 0输出图像:
原始图片:
我做错了什么?或者它应该这样做?
答案 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)