核心图像CIPerspectiveTransformfilter:如何使用CIVectors?

我很难在网上找到任何文档,清楚地解释了如何正确实现Core Image的CIPerspectiveTransformfilter。 特别是,当为inputTopLeftinputTopRightinputBottomRightinputBottomLeft设置CIVector值时,这些向量对图像做了什么? (即,这些矢量如何扭曲我的图像背后的数学是什么?)

目前这是我正在使用的代码。 它不会崩溃,但它不会显示图像:

 CIImage *myCIImage = [[CIImage alloc] initWithImage:self.image]; CIContext *context = [CIContext contextWithOptions:nil]; CIFilter *filter = [CIFilter filterWithName:@"CIPerspectiveTransform" keysAndValues:@"inputImage", myCIImage, @"inputTopLeft", [CIVector vectorWithX:118 Y:484], @"inputTopRight", [CIVector vectorWithX:646 Y:507], @"inputBottomRight", [CIVector vectorWithX:548 Y:140], @"inputBottomLeft", [CIVector vectorWithX:155 Y:153], nil]; CIImage *outputImage = [filter outputImage]; CGImageRef cgimg = [context createCGImage:outputImage fromRect:[outputImage extent]]; UIImage *transformedImage = [UIImage imageWithCGImage:cgimg]; [self setImage:transformedImage]; CGImageRelease(cgimg); 

其他需要注意的事项可能很重要:

  • 我的UIImageView(75pts x 115 pts)已经通过awakeFromNib初始化,并且已经有一个与之关联的图像(151px x 235px)。

  • 上面的代码是在UIImageView中实现的- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event函数。 希望是我能够根据屏幕坐标调整图像的透视,使其看起来像是在3D空间中移动。

  • 此代码适用于iPhone应用程序。

同样,我认为我问的问题是各种参数向量的作用,但我可能会问错误的问题。

以下post非常相似,但是询问为什么他的图像会消失,而不是如何使用CIVectors进行CIPerspectiveTransform。 它也很少受到牵引,也许是因为它过于笼统: 我如何使用CIPerspectiveTransformfilter

正如我对链接问题发表评论时,自iOS 5.1以来,CIPersersTransform 在Core Image的iOS实现中不可用 。 这就是为什么你和其他提问者没有看到任何图像的原因,因为很可能你的CIFilter是零。

如果你只想在图像上实现一种透视forms,那么在iOS上有两种不同的快速方式,正如我在这个答案中描述的那样。 一种是在UIImageView的图层上简单地使用正确的CATransform3D ,但这仅适用于显示,而不适用于图像调整。

第二种方法是在OpenGL ES中使用适当的3-D变换矩阵来操纵图像。 正如我在上面链接的答案中指出的那样,我有一个包装所有这些的开源框架 ,而FilterShowcase示例中有一个将透视应用于传入video的示例。 您可以轻松地将video输入替换为图像,并在应用透视效果后从中获取图像。