iOS cgimageで回転を効率的に行う方法(最大125フレーム)?

私は2つの画像を持っているので、画像Aと画像Bと呼んでみましょう。画像Aを回転させて拡大縮小し、特定の位置で画像Bの上に描画しようとしています。

私は以下の関数とメソッドを使用します: 1.画像の回転と拡大縮小 2.特定の場所の画像Bに画像Aを描画します。

このコードは正常に動作しますが、遅いですが、改善する方法はありますか?

回転と拡大縮小機能:

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

別のイメージ内の特定の場所にイメージを描画する方法:

-(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
あなたが達成しようとしているスピード(125 FPS)はiPhoneを使って可能だとは思わない。
追加された 著者 samfisher,
ターゲットを25 fpsにするために5秒間処理します。
追加された 著者 Pierre Addoum,

1 答え

同時に多くのイメージを作成する場合は、同じCGContextを再利用してください。また、新しい回転イメージを作成しないでください。既存のコンテキスト内でイメージを回転させます。

基本的に、CGContextを何回作成しなくても、何回でもCGContextを作成すればよいのです。それは物事を大幅にスピードアップするはずです。

1
追加された