Преобразуйте CATransform3D в CIVector для CIPerspectiveTransform, замените UIGetScreenImage
Можно ли конвертировать CATransform3D
в набор CIVectors
для того, чтобы превратить UIImage
с CATransform3D
?
Я считаю, что теперь, наконец, можно заменить UIGetScreenImage()
Способность сглаживать трехмерные преобразования UIView/CALayer
в изображение путем обхода иерархии представления и рендеринга отдельных изображений, а затем применяя CATransform3D
к изображению, которое было создано.
Я начал работать с GPUImage
, который принимает CATransform3Ds
применить к UIImage
и к сожалению не повезло. Прикрепленный код, который я использовал, и ссылки на изображения, которые были произведены.
- (UIImage*)iterateLayerHierarchy:(CALayer*)layer
{
UIGraphicsBeginImageContextWithOptions(CGSizeMake(layer.frame.size.width,
layer.frame.size.height),
NO,
0.0);
for (CALayer *sublayer in layer.sublayers)
{
UIImage* subImage;
if (sublayer.sublayers.count > 1) {
subImage = [self iterateLayerHierarchy:sublayer];
} else {
subImage = [UIView getImageFromLayer:sublayer];
}
CGRect imageRect;
if (isRetina()) {
imageRect = CGRectMake(sublayer.position.x-subImage.size.width/4,
sublayer.position.y-subImage.size.height/4,
subImage.size.width,
subImage.size.height);
}else{
imageRect = CGRectMake(sublayer.position.x-subImage.size.width/2,
sublayer.position.y-subImage.size.height/2,
subImage.size.width,
subImage.size.height);
}
[subImage drawInRect:imageRect];
//sublayer.hidden = YES;
}
UIImage * img = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return img;
}
+ (UIImage*) getImageFromLayer:(CALayer *)layer
{
UIGraphicsBeginImageContextWithOptions(CGSizeMake(layer.bounds.size.width,
layer.bounds.size.height),
NO,
0.0);
[layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage * img = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
if (!CATransform3DEqualToTransform(layer.transform, CATransform3DIdentity))
{
GPUImageTransformFilter *transformFilter = [[GPUImageTransformFilter alloc] init];
transformFilter.transform3D = layer.transform;
img = [transformFilter imageByFilteringImage:img];
}
return img;
}
1 ответ
Хотя это не прямой ответ на вопрос, с iOS 7 больше нет необходимости решать эту проблему. "UIGetScreenImage()" фактически заменен на "drawViewHierarchyInRect:", который способен одновременно захватывать как слои OpenGL, так и представления на основе UIKit.