2013-05-02 41 views
4

是否可以將CATransform3D轉換爲一組CIVectors以便將UIImage轉換爲CATransform3D將CATransform3D轉換爲用於CIPerspectiveTransform的CIVector,替換UIGetScreenImage

相信是現在終於可以更換UIGetScreenImage()的通過遍歷視圖層次和渲染單個圖像,然後將所述CATransform3D到所創建的圖像變平的UIView/CALayer 3D變換成圖像的能力。

我開始使用GPUImage,它確實接受CATransform3Ds以適用於UIImage,不幸的是沒有運氣。附件是我正在使用的代碼,並鏈接到生成的圖像。

Screenshot of Simulator

Image Produced

- (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; 
} 
+0

從理論上講,可以計算'CIVerspectiveTransform'的'CIVector's,但你真的不想這樣做。 'CIPerspectiveTransform'是越野車。不要相信我?只需交換圖像的底部和頂部座標,這將失敗。 (你會得到某種方形thingie)。 – idz 2013-05-04 06:34:39

+0

我一直在嘗試,顯然CIPerspectiveTransform的CIVector只是要求X,Y值的角點。我通過使用convertPoint:toLayer得到了這些,但它不太正確。我不確定它是否有問題,或者我只是做得不對。 – 2013-05-04 15:43:50

回答

0

雖然沒有直接回答這個問題,因爲iOS的7已經不再有必要解決這個問題。 「UIGetScreenImage()」已被「drawViewHierarchyInRect:」有效地替代,它可以同時捕獲基於OpenGL圖層和基於UIKit的視圖。