I have two images, call them image A and image B. I'm trying to rotate and scale image A and draw it on top of image B in a specific place.
I use the following functions and methods: 1. Rotate and scale the image 2. Draw image A into image B in a specific place.
This code works fine, but rather slow, is there any way to improve it?
Function for rotation and scaling:
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));
A way to draw an image in a specific place within another image:
-(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; }