在绘制上下文时,在UIImage上应用CATransform3D

时间:2017-01-03 06:42:13

标签: ios objective-c uiimageview uiimage catransform3d

我有几个UIImageView并在其图层属性上应用了CATransform3D,现在我想获得一个图像(将所有图像合并到一个转换中)。

为此,我使用CoreGraphics框架在上下文中绘制图像,然后得到结果图像。

需要实现这一目标:

  • 使用CATransform3D在上下文中绘制每个图像,然后从图像上下文中获取图像。

我试过这个,但没有成功。

CGContextRef context = UIGraphicsGetCurrentContext();
CGContextConcatCTM(context, CATransform3DGetAffineTransform(imageView.layer.transform));
CGContextDrawImage(context, (CGRect){ CGPointZero, imageView.image.size }, [imageView.image CGImage]);
CGContextTranslateCTM(context, 0, imageView.frame.size.height);
CGContextScaleCTM(context, 1.0, -1.0);

UIImage *resultImage = UIGraphicsGetImageFromCurrentImageContext();

我也尝试过CoreImage框架,但仍然没有运气。 :(

CIImage *ciImage = [CIImage imageWithData:UIImagePNGRepresentation(imageView.image)];
CIContext *context = [CIContext contextWithOptions:nil];
CIDetector *detector = [CIDetector detectorOfType:CIDetectorTypeRectangle context:context options:@{CIDetectorAccuracy: CIDetectorAccuracyHigh}];

CIRectangleFeature *rect = (CIRectangleFeature *)[detector featuresInImage:ciImage options:@{CIDetectorImageOrientation : [NSNumber numberWithInt:1]}].firstObject;

CIFilter *filterMain = [CIFilter filterWithName:@"CIPerspectiveCorrection"];
[filterMain setValue:[CIVector vectorWithCGPoint:rect.topLeft] forKey:@"inputTopLeft"];
[filterMain setValue:[CIVector vectorWithCGPoint:rect.topRight] forKey:@"inputTopRight"];
[filterMain setValue:[CIVector vectorWithCGPoint:rect.bottomRight] forKey:@"inputBottomRight"];
[filterMain setValue:[CIVector vectorWithCGPoint:rect.bottomLeft] forKey:@"inputBottomLeft"];
[filterMain setValue:sourceCIImage forKey:kCIInputImageKey];

CIImage *outputImage = [filterMain valueForKey:kCIOutputImageKey];
UIImage *resultImage = [UIImage imageWithCIImage:outputImage];

大约一行代码给了我一些奇怪的结果。

我尝试的另一件事是drawViewHierarchyInRect:afterScreenUpdates:方法,但它给了我非常模糊的图像。

那么如何使用CATransform3D在上下文中绘制图像?如果有人遇到这种问题并修好了,请分享您的想法。任何帮助将不胜感激。

注意:我不是在谈论CGAffineTransformation它的CATransform3D

1 个答案:

答案 0 :(得分:2)

Apple提供了一个名为CoreImage的框架,您可以通过应用过滤器来获得转换后的图像。您可以使用"user1" - week 1 - 1 "user1" - week 2 - 2 "user2" - week 1 - 2 过滤器通过传递图像/图像视图的四个角(TopLeft,TopRight,BottomLeft和BottomRight)来获取变换后的图像。

我已经回答了这类问题here...