我很难在网上找到任何可以清楚地解释如何正确实现 Core Image 的 CIPerspectiveTransform 过滤器的文档。特别是,当为inputTopLeft
、inputTopRight
、inputBottomRight
和设置 CIVector 值时,inputBottomLeft
这些向量对图像有什么作用?(即,这些向量如何扭曲我的图像背后的数学原理是什么?)
目前这是我正在使用的代码。它不会崩溃,但不会显示图像:
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 应用程序。
同样,我想我要问的问题是各种参数向量的作用,但我可能问错了问题。
以下帖子非常相似,但询问的是为什么他的图像消失了,而不是如何使用 CIVectors 进行 CIPerspectiveTransform。它也很少受到关注,可能是因为它太笼统了: 我如何使用 CIPerspectiveTransform 过滤器