title: iOS How to perform rotation on a cgimage efficiently (up to 125 frames)?
body: <p>I have two images, let's call them image A and image B. I'm trying to rotate and scale image A and to draw it on top of image B at specific location.</p>
  
  <p>I use the function and method below to :
  1. rotate and scale my image 
  2. Draw Image A into Image B at a specific location.</p>
  
  <p>This code works fine but is rather slow, is there a way to improve it?</p>
  
  <p>Function to rotate and scale :</p>
  
  <pre><code>CGImageRef rotateAndScaleImageCreate(const CGImageRef cgImage, const CGFloat radians,const CGFloat scalefactor){
  CGImageRef rotatedImageRef = NULL;
  
  const CGFloat originalWidth = CGImageGetWidth(cgImage)*scalefactor;
  const CGFloat originalHeight = CGImageGetHeight(cgImage)*scalefactor;
  
  const CGRect imgRect = (CGRect){.origin.x = 0.0f, .origin.y = 0.0f, .size.width = originalWidth, .size.height = originalHeight};
  const CGRect rotatedRect = CGRectApplyAffineTransform(imgRect, CGAffineTransformMakeRotation(radians));
  
  /// Create an ARGB bitmap context
  CGContextRef bmContext = NYXImageCreateARGBBitmapContext(rotatedRect.size.width, rotatedRect.size.height, 0);
  if (!bmContext)
      return nil;
  
  /// Rotation happen here
  CGContextTranslateCTM(bmContext, +(rotatedRect.size.width * 0.5f), +(rotatedRect.size.height * 0.5f));
  CGContextRotateCTM(bmContext, radians);
  
  /// Draw the image in the bitmap context
  CGContextDrawImage(bmContext, (CGRect){.origin.x = -originalWidth * 0.5f, .origin.y = -originalHeight * 0.5f, .size.width = originalWidth, .size.height = originalHeight}, cgImage);
  
  /// Create an image object from the context
  rotatedImageRef = CGBitmapContextCreateImage(bmContext);
  
  /// Cleanup
  //CGImageRelease(rotatedImageRef);
  CGContextRelease(bmContext);
  
  return rotatedImageRef;
  }
  </code></pre>
  
  <p>Method to draw image at specific location within another image:</p>
  
  <pre><code>-(UIImage*) PositionImage:(CGImageRef)image backgroundImage:(CGImageRef)backgroundImage atPointX:(float)X pointY:(float)Y withScale:(float)scale andRotation:(float)rotation{
  
  
  //////////////////////////////////////////
  
  CGLayerRef          layer;
  
  CGImageRef          resultImage;
  
  CGContextRef        context, layerContext;
  void                *bitmapData;
  CGColorSpaceRef     colorSpace;
  CGSize              canvasSize;
  
  int                 bitmapByteCount;
  int                 bitmapBytesPerRow;
  
  //Get the background image
  //UIImage * backgroundImg = [UIImage imageNamed:@"Mask-Inverted.png"];
  
  //Initialize the canvas size!
  canvasSize = CGSizeMake(480,640);//[backgroundImg size];
  
  
  //
  bitmapBytesPerRow   = (canvasSize.width * 4);
  bitmapByteCount     = (bitmapBytesPerRow * canvasSize.height);
  
  //Create the color space
  colorSpace = CGColorSpaceCreateDeviceRGB();
  
  bitmapData = malloc( bitmapByteCount );
  
  //Check the the buffer is alloc'd
  if( bitmapData == NULL ){
      NSLog(@"Buffer could not be alloc'd");
  }
  
  //Create the context
  context = CGBitmapContextCreate(bitmapData, canvasSize.width, canvasSize.height, 8, bitmapBytesPerRow, colorSpace, kCGImageAlphaPremultipliedLast);
  
  if( context == NULL ){
      NSLog(@"Context could not be created");
  }
  
  
  ///Create the Layer
  layer = CGLayerCreateWithContext(context, canvasSize, NULL);
  
  if( layer == NULL ){
      NSLog(@"Layer could not be created");
  }
  
  ///Create the layer  Context
  layerContext = CGLayerGetContext(layer);
  
  if( layerContext == NULL){
      NSLog(@"No Layer context");
  }
  
  
  //Draw the image background into the bitmap context
  CGContextDrawImage(context, CGRectMake(0.0f,0.0f,480,640),backgroundImage);
  
  //Rotate and Scale Image
  CGImageRef rotatedImage =rotateAndScaleImageCreate(image,rotation,scale);
  
  //Draw a image on the layer
  CGContextDrawImage(layerContext,CGRectMake(0,0,CGImageGetWidth(rotatedImage),CGImageGetHeight(rotatedImage)),rotatedImage);
  CGImageRelease(rotatedImage);
  
  //Draw the layer in the context at the coordinate
  CGContextDrawLayerAtPoint( context, CGPointMake(X-CGImageGetWidth(rotatedImage)*0.5f, Y-CGImageGetHeight(rotatedImage)*0.5f), layer);
  CGLayerRelease(layer);
  
  //Get the result image
  resultImage = CGBitmapContextCreateImage(context);
  CGContextRelease(context);
  
  //Cleanup
  free(bitmapData);
  CGColorSpaceRelease(colorSpace);
  //Create UIImage
  UIImage *imageReturned = [UIImage imageWithCGImage:resultImage];
  CGImageRelease(resultImage);
  return imageReturned;
  
  }
  </code></pre>