title: How do I create/render a UIImage from a 3D transformed UIImageView?
body: <p>After applying a 3d transform to an UIImageView.layer, I need to save the resulting "view" as a new UIImage...  Seemed like a simple task at first :-) but no luck so far, and searching hasn't turned up any clues :-( so I'm hoping someone will be kind enough to point me in the right direction.</p>
  
  <p>A very simple iPhone project is available <a href="http://code.google.com/p/iphoneviewtransformdemo/" rel="nofollow noreferrer">here</a>.</p>
  
  <p>Thanks.</p>
  
  <pre><code>- (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 &lt;QuartzCore/QuartzCore.h&gt;
  #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);  
  }
  </code></pre>