4
是否可以將CATransform3D
轉換爲一組CIVectors
以便將UIImage
轉換爲CATransform3D
?將CATransform3D轉換爲用於CIPerspectiveTransform的CIVector,替換UIGetScreenImage
相信是現在終於可以更換UIGetScreenImage()
的通過遍歷視圖層次和渲染單個圖像,然後將所述CATransform3D
到所創建的圖像變平的UIView/CALayer
3D變換成圖像的能力。
我開始使用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;
}
從理論上講,可以計算'CIVerspectiveTransform'的'CIVector's,但你真的不想這樣做。 'CIPerspectiveTransform'是越野車。不要相信我?只需交換圖像的底部和頂部座標,這將失敗。 (你會得到某種方形thingie)。 – idz 2013-05-04 06:34:39
我一直在嘗試,顯然CIPerspectiveTransform的CIVector只是要求X,Y值的角點。我通過使用convertPoint:toLayer得到了這些,但它不太正確。我不確定它是否有問題,或者我只是做得不對。 – 2013-05-04 15:43:50