Ich füge zwei UIImagages in einen Kontext zusammen. Es funktioniert, aber es funktioniert ziemlich langsam und ich brauche eine schnellere Lösung. Als meine Lösung dauert es etwa 400ms, um den mergeImage: withImage:
Anruf auf einem iPad 1G zu tätigen.Zwei UIImagages schneller zusammenführen als CGContextDrawImage
Hier ist, was ich tue:
-(CGContextRef)mergeImage:(UIImage*)img1 withImage:(UIImage*)img2
{
CGSize size = [ImageToolbox getScreenSize];
CGContextRef context = [ImageToolbox createARGBBitmapContextFromImageSize:CGSizeMake(size.width, size.height)];
CGContextSetRenderingIntent(context, kCGRenderingIntentSaturation);
CGContextDrawImage(context, CGRectMake(0, 0, size.width, size.height), img1.CGImage);
CGContextDrawImage(context, CGRectMake(0, 0, size.width, size.height), img2.CGImage);
return context;
}
Und hier ist die statischen Methoden aus der ImageToolbox Klasse:
static CGRect screenRect;
+ (CGContextRef)createARGBBitmapContextFromImageSize:(CGSize)imageSize
{
CGContextRef context = NULL;
CGColorSpaceRef colorSpace;
void * bitmapData;
int bitmapByteCount;
int bitmapBytesPerRow;
size_t pixelsWide = imageSize.width;
size_t pixelsHigh = imageSize.height;
bitmapBytesPerRow = (pixelsWide * 4);
bitmapByteCount = (bitmapBytesPerRow * pixelsHigh);
colorSpace = CGColorSpaceCreateDeviceRGB();
if (colorSpace == NULL)
{
fprintf(stderr, "Error allocating color space\n");
return NULL;
}
bitmapData = malloc(bitmapByteCount);
if (bitmapData == NULL)
{
fprintf (stderr, "Memory not allocated!");
CGColorSpaceRelease(colorSpace);
return NULL;
}
context = CGBitmapContextCreate (bitmapData,
pixelsWide,
pixelsHigh,
8, // bits per component
bitmapBytesPerRow,
colorSpace,
kCGImageAlphaPremultipliedFirst);
if (context == NULL)
{
free (bitmapData);
fprintf (stderr, "Context not created!");
}
CGColorSpaceRelease(colorSpace);
return context;
}
+(CGSize)getScreenSize
{
if (screenRect.size.width == 0 && screenRect.size.height == 0)
{
screenRect = [[UIScreen mainScreen] bounds];
}
return CGSizeMake(screenRect.size.height, screenRect.size.width-20);
}
Irgendwelche Vorschläge, die Leistung zu steigern?
Können Sie messen, wie lange jede Methode dauert? – EmilioPelaez
Die Aufrufe von drawImage dauern etwa 400 ms, der Rest der Methoden liegt jeweils unter 10 ms. –
Sind diese Bilder, die Sie vorher kombinieren können, mit Ihrer App zu versenden? Der Performance-Hit ist wahrscheinlich auf eine Kombination aus Farbraum und Alpha-Multiplikation zurückzuführen. Spielen Sie ein bisschen mit denen herum. –