在上下文中绘制时在 UIImage 上应用 CATransform3D
Apply CATransform3D on UIImage while drawing on context
我有几个 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];
代码的 about 行给了我一些奇怪的结果。
我尝试过的另一件事是 drawViewHierarchyInRect:afterScreenUpdates:
方法,但它给我的图像非常模糊。
那么如何使用 CATransform3D 在上下文中绘制图像呢?如果有人遇到过此类问题并已解决,请分享您的想法。任何帮助将不胜感激。
注意:我不是在谈论 CGAffineTransformation 它的 CATransform3D
Apple提供了一个名为CoreImage的框架,您可以通过应用滤镜来获得转换后的图像。您可以使用 CIPerspectiveTransform
过滤器通过传递 image/imageview 的四个角(TopLeft、TopRight、BottomLeft 和 BottomRight)来获得转换后的图像。
我回答过这种问题
我有几个 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];
代码的 about 行给了我一些奇怪的结果。
我尝试过的另一件事是 drawViewHierarchyInRect:afterScreenUpdates:
方法,但它给我的图像非常模糊。
那么如何使用 CATransform3D 在上下文中绘制图像呢?如果有人遇到过此类问题并已解决,请分享您的想法。任何帮助将不胜感激。
注意:我不是在谈论 CGAffineTransformation 它的 CATransform3D
Apple提供了一个名为CoreImage的框架,您可以通过应用滤镜来获得转换后的图像。您可以使用 CIPerspectiveTransform
过滤器通过传递 image/imageview 的四个角(TopLeft、TopRight、BottomLeft 和 BottomRight)来获得转换后的图像。
我回答过这种问题