4

を で変換するために、CATransform3Dを のセットに変換することは可能ですか?CIVectorsUIImageCATransform3D

ビュー階層をトラバースして個々の画像をレンダリングし、作成された画像に を適用することで、 のUIGetScreenImage()3D 変換を画像にフラット化する の機能を置き換えることがついに可能になったと思います。UIView/CALayerCATransform3D

GPUImage私はと仕事を始めましCATransform3DsUIImage. 私が使用していたコードと、生成された画像へのリンクが添付されています。

シミュレーターのスクリーンショット

画像制作

- (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;
}
4

1 に答える 1