IOS How to efficiently rotate on cgimage (up to 125 frames)?

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)); /// 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; } 

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; } 
+4
source share
1 answer

If you create many images at once, reuse the same CGContext. Also, do not create a new rotated image; rotate the image in an existing context.

Basically, you only need to create a CGContext once, no matter how many images you end up with with it. This should significantly speed up the process.

+1
source

Source: https://habr.com/ru/post/1386958/


All Articles