iPhone - НЕВОЗМОЖНО ли получить содержимое композиции CALayers? - PullRequest
2 голосов
/ 18 февраля 2010

У меня есть CALayer, преобразованный в 3D на экране UIView (намного больше, чем 320x480).

Как сбросить то, что видно на этом 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 ]

4 голосов
/ 25 февраля 2010

В пределах iPhone SDK нет способа сделать это. Вы можете захватить содержимое экрана с помощью UIGetScreenImage или использовать -[CALayer renderInContext:], чтобы слой рисовался в CGContext, но заставить GPU объединить только часть слоев в буфер - это то, чего можно достичь только с помощью частные API и методы.

3 голосов
/ 18 февраля 2010

Попробуйте это:

UIGraphicsBeginImageContext( myView.bounds.size );
[myView.layer renderInContext: UIGraphicsGetCurrentContext()];
UIImage* viewImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
0 голосов
/ 10 ноября 2010

Всегда открывайте свой CGContext с новой функцией UIGraphicsBeginImageContextWithOptions, как показано ниже:

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).

0 голосов
/ 05 июня 2010

Если вам нужно более высокое разрешение, вам нужно увеличить CGContext

0 голосов
/ 20 февраля 2010

В дополнение к предложениям @ jessecurry, вы пробовали это?

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

В основном применяя ту же идею, но на уровне представления. Предполагается, что он вернет слой с примененными к нему анимациями и свойствами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...