CICrop的裁剪CIImage无法正常工作 [英] Cropping CIImage with CICrop isn't working properly

查看:678
本文介绍了CICrop的裁剪CIImage无法正常工作的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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



我正在使用矩形裁剪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输出图片





使用CIVector X 0和Y 0输出图片



原始图片:





我做错了什么?

解决方案

您确定输出图像是您预期的大小吗?如何绘制输出图像?



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

//你还需要翻译原文
CIFilter * transform = [CIFilter filterWithName:@CIAffineTransform];
NSAffineTransform * affineTransform = [NSAffineTransform transform];
[affineTransform translateXBy:-150.0 yBy:-150.0];
[transformation setValue:affineTransform forKey:@inputTransform];
[transform setValue:croppedImage forKey:@inputImage];
CIImage * transformedImage = [transform valueForKey:@outputImage];


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)

Output Image with CIVector X 0 and Y 0:

Original Image:

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

解决方案

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

这篇关于CICrop的裁剪CIImage无法正常工作的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆