title: How to rotate and crop iOS CGImage from file
body: <p>I'm having some trouble with image rotation in iOS.  I'm performing some image manipulation in the background of an app... I would like to rotate and crop the images.  Currently, the rotation seems to be working correctly, but no matter what I have tried, the crop is off.  I have performed these same operations in GIMP and found that the images crop correctly, so I believe it has something to do with the Quartz coordinate system.  Furthermore, the greater the radians in either direction, the further "off" the crop becomes.  Here is the code I am using to rotate and crop:</p>
  
  <pre><code>+(UIImage*)imageWithImageFile:(NSString*)imageFile
                        radians:(float)radians
                      imageSize:(CGSize)imageSize
                  croppedToRect:(CGRect)croppedToRect
  {
      UIImage* returnImg = nil;
      @autoreleasepool {
          CGDataProviderRef dataProvider = CGDataProviderCreateWithFilename([imageFile UTF8String]);
          CGImageRef image = CGImageCreateWithJPEGDataProvider(dataProvider, NULL, YES, kCGRenderingIntentDefault);
          UIGraphicsBeginImageContext(croppedToRect.size);
  
          CGContextRef context = UIGraphicsGetCurrentContext();
  
          CGContextSetShouldAntialias(context, YES);
          CGContextSetAllowsAntialiasing(context, YES);
          CGContextSetInterpolationQuality(context, kCGInterpolationHigh);
  
          CGContextTranslateCTM(context, imageSize.width * 0.5,
                                imageSize.height * 0.5);
          CGContextRotateCTM(context, radians);
          CGContextTranslateCTM(context, -imageSize.width * 0.5, -imageSize.height * 0.5);
  
          //Translate and scale upside-down to compensate for Quartz's inverted coordinate system
          CGContextTranslateCTM(context, 0.0, imageSize.height);
          CGContextScaleCTM(context, 1.0, -1.0);
  
          CGContextDrawImage(context, (CGRect) {croppedToRect.origin, imageSize}, image);
          returnImg = UIGraphicsGetImageFromCurrentImageContext();
  
          UIGraphicsEndImageContext();
          CGDataProviderRelease(dataProvider);
          CGImageRelease(image);
      }
  
      return returnImg;
  }
  </code></pre>