ios - 在上下文上绘图时在 UIImage 上应用 CATransform3D

标签 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

最佳答案

Apple提供了一个名为CoreImage的框架,您可以通过应用滤镜来获得变换后的图像。您可以使用 CIPerspectiveTransform 过滤器通过传递图像/ ImageView 的四个角(TopLeft、TopRight、BottomLeft 和 BottomRight)来获取变换后的图像。

我回答过此类问题here...

关于ios - 在上下文上绘图时在 UIImage 上应用 CATransform3D,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41437827/

相关文章:

ios - UIImages NSURL 和线程

ios - SwiftUI:观察@Environment 属性变化

ios - 以编程方式自动布局不垂直居中

objective-c - Cocoa WebView不响应键盘事件

ios - 标签栏 Controller : Orienting views in different orientations

ios - 如何在iOS中横向和纵向旋转图像?

ios - IQKeyboardManager 的“完成”按钮操作在 Swift 中不起作用

ios - 代码 "An error occurred during upload, rsync: failed"

ios - 当页面更改时,我的 UIPageViewController 中的下一页仅部分加载

ios - 在 ImageView 上加载图像时内存增加?