【发布时间】:2009-12-22 20:39:34
【问题描述】:
对 UIImageView.layer 应用 3d 变换后,我需要将生成的“视图”保存为新的 UIImage...起初看起来像一个简单的任务 :-) 但到目前为止还没有运气,而且搜索还没有t 找到任何线索 :-( 所以我希望有人能善意地指出我正确的方向。
一个非常简单的 iPhone 项目可用here。
谢谢。
- (void)transformImage {
float degrees = 12.0;
float zDistance = 250;
CATransform3D transform3D = CATransform3DIdentity;
transform3D.m34 = 1.0 / zDistance; // the m34 cell of the matrix controls perspective, and zDistance affects the "sharpness" of the transform
transform3D = CATransform3DRotate(transform3D, DEGREES_TO_RADIANS(degrees), 1, 0, 0); // perspective transform on y-axis
imageView.layer.transform = transform3D;
}
/* FAIL : capturing layer contents doesn't get the transformed image -- just the original
CGImageRef newImageRef = (CGImageRef)imageView.layer.contents;
UIImage *image = [UIImage imageWithCGImage:newImageRef];
*/
/* FAIL : docs for renderInContext states that it does not render 3D transforms
UIGraphicsBeginImageContext(imageView.image.size);
[imageView.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
*/
//
// header
//
#import <QuartzCore/QuartzCore.h>
#define DEGREES_TO_RADIANS(x) x * M_PI / 180
UIImageView *imageView;
@property (nonatomic, retain) IBOutlet UIImageView *imageView;
//
// code
//
@synthesize imageView;
- (void)transformImage {
float degrees = 12.0;
float zDistance = 250;
CATransform3D transform3D = CATransform3DIdentity;
transform3D.m34 = 1.0 / zDistance; // the m34 cell of the matrix controls perspective, and zDistance affects the "sharpness" of the transform
transform3D = CATransform3DRotate(transform3D, DEGREES_TO_RADIANS(degrees), 1, 0, 0); // perspective transform on y-axis
imageView.layer.transform = transform3D;
}
- (UIImage *)captureView:(UIImageView *)view {
UIGraphicsBeginImageContext(view.frame.size);
[view.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return newImage;
}
- (void)imageSavedToPhotosAlbum:(UIImage *)image didFinishSavingWithError:(NSError *)error contextInfo:(void *)contextInfo {
NSString *title = @"Save to Photo Album";
NSString *message = (error ? [error description] : @"Success!");
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:title message:message delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
[alert show];
[alert release];
}
- (IBAction)saveButtonClicked:(id)sender {
UIImage *newImage = [self captureView:imageView];
UIImageWriteToSavedPhotosAlbum(newImage, self, @selector(imageSavedToPhotosAlbum: didFinishSavingWithError: contextInfo:), nil);
}
【问题讨论】:
-
您是否尝试过抓取包含转换后的视图的视图?
-
不太清楚你的意思...我试过 [view image](其中 view 是我的 UIImageView),但返回的图像不是转换后的图像。
-
找到答案?
-
这个问题你得到答案了吗?请帮我。我有同样的问题,更改 3D 变换并保存图像后。有可能吗?
-
那是因为图层内容没有被变换,
[imageView.layer renderInContext:...]在imageView的坐标系中渲染。转换应用在视图和它的父视图之间,因此为了有任何工作的机会,您需要将它粘贴在容器视图中并渲染容器(但如果文档说它没有) t 处理 3D 变换,那么它可能无论如何都不起作用,尽管我希望应用 某种 类型的变换)。
标签: iphone cocoa-touch core-animation