iPhone - 抓住CALayers组合的内容是不可能的吗?

时间:2010-02-18 15:53:16

标签: iphone iphone-sdk-3.0

我在屏幕外的UIView(远大于320x480)上用3D转换了CALayer。

如何将此UIView上显示的内容转储到UIImage?

注意:我已编辑了问题以包含此代码...

这是我创建图层的方式......

CGRect area = CGRectMake (0,0,400,600];
vista3D = [[UIView alloc] initWithFrame:area ];

[self.view addSubview:vista3D];
[vista3D release];

transformed = [CALayer layer];
transformed.frame = area;
[vista3D.layer addSublayer:transformed];

CALayer *imageLayer = [CALayer layer];
imageLayer.doubleSided = YES; 

imageLayer.frame = area;
imageLayer.transform = CATransform3DMakeRotation(40 * M_PI / 180.0f, 1.0f, 0.0f, 0.0f);

imageLayer.contents = (id)myRawImage.CGImage;

[transformed addSublayer:imageLayer];

// Add a perspective effect
CATransform3D initialTransform = transformed.sublayerTransform;
initialTransform.m34 = 1.0 / -500;
transformed.sublayerTransform = initialTransform;

// now the layer is in perspective
// my next step is to "flatten" the composition into a UIImage

UIImage *thisIsTheResult = some magic command

感谢您的帮助!

编辑1:我尝试过jessecurry解决方案,但它给了我一个没有透视的平面图层。

编辑2:我发现了一个可行的部分解决方案,但是这个解决方案给了我一个大小与屏幕相同的图像,我正在寻找获得更高分辨率的版本,渲染屏幕。

5 个答案:

答案 0 :(得分:4)

在iPhone SDK的范围内,没有办法做到这一点。您可以使用UIGetScreenImage抓取屏幕内容或使用-[CALayer renderInContext:]将图层绘制到CGContext,但强制GPU仅将一部分图层合成到缓冲区中只能使用私有API和方法来实现。

答案 1 :(得分:3)

试试这个:

UIGraphicsBeginImageContext( myView.bounds.size );
[myView.layer renderInContext: UIGraphicsGetCurrentContext()];
UIImage* viewImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

答案 2 :(得分:0)

除了@ jessecurry的建议外,你试过这个吗?

UIGraphicsBeginImageContext( myView.bounds.size );
[[myView.layer presentationLayer] renderInContext: UIGraphicsGetCurrentContext()];
UIImage* viewImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

基本上应用相同的想法,但在presentatioLayer。这应该返回具有应用于它的任何动画和属性的图层。

答案 3 :(得分:0)

始终使用新的UIGraphicsBeginImageContextWithOptions函数打开CGContext,如下所示:

CGSize visibleArea = self.view.bounds.size;
CGFloat myContentScaleFactor = effect.contentScaleFactor; //this property is 2.0 for some devices

UIGraphicsBeginImageContextWithOptions(visibleArea, NO, myContentScaleFactor);
[some.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

这对我有用(iPhone3G,3GS,4)。

答案 4 :(得分:-2)

如果你想要更高的分辨率,那么你需要扩大CGContext