2011-01-07 13 views
5

estoy usando el siguiente código para unir dos UIImages,
pregunto si hay una manera más rápida.(iphone) composición rápida UIImage (fusión)?

- (UIImage*) combineImage: (UIImage*) aImage 
{ 
    UIGraphicsBeginImageContext(self.size); 
    [self drawInRect: CGRectMake(0, 0, self.size.width, self.size.height)]; 
    [aImage drawInRect: CGRectMake(0, 0, self.size.width, self.size.height)]; 


    UIImage* combinedImage = UIGraphicsGetImageFromCurrentImageContext(); //                                                 
    UIGraphicsEndImageContext(); 
    return combinedImage; 
} 
+0

podría ser simplemente el tamaño de la imagen que está tratando? Si el UIImage es de tu propio paquete, intenta hacerlo más pequeño usando ImageOptim. – prince

+0

Supongo que será más rápido si usa funciones de Quartz en lugar de wrappers ... algo así como CGContextDrawImage, etc ... pero la mayor decencia viene del tamaño de sus imágenes. – Andrea

+0

el resultado siempre será una imagen, ya que superpone la imagen por completo ... entonces, ¿qué marge? –

Respuesta

0

Usando UIKit requiere que lo haces en el hilo principal (versiones recientes de reclamo IOS para trabajar en las discusiones de fondo, pero esto no ha parecido ser el caso en mis pruebas).

Una manera más rápida (o más receptiva) de hacerlo es hacerlo en una cadena de fondo usando Quartz como se describió. El problema con eso es que el proceso efectivamente se vuelve asincrónico. Necesitará alguna forma de devolución de llamada. Ejemplo del nombre del método podría ser

- (void)generateMergedImageWith:(UIImage *)aImage callback:(mergeCallbackBlock)callback 

(que puede ser un delegado conforme a algún protocolo en cambio, si se prefiere no utilizar devoluciones de llamada de bloque, y si usted desea utilizar el bloque, es necesario typedef 'mergeCallbackBlock' apropiadamente)

Ejemplo (no probado, sacado de aplicación de trabajo) podría ser:

CGImageRef firstCGImage = [self CGImage]; 
CGImageRef secondCGImage = [aImage CGImage]; 
// we presume the two images are equal size, or that the two images should be the size of self 
CGSize size = [self size]; 
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0), ^{ 
    // below context presumes a number of things about the images and may need to be more aware 
    CGContextRef ctx = CGBitmapContextCreate(NULL, size.width, size.height, 
          8, size.width * 4, CGImageGetColorSpace(firstCGImage), 
          kCGImageAlphaPremultipliedFirst | kCGBitmapByteOrder32Little); 
    // we presume ctx succeeded; it may be NULL if it did not 
    CGContextDrawImage(ctx, (CGRect){CGPointZero, size}, firstCGImage); 
    CGContextDrawImage(ctx, (CGRect){CGPointZero, size}, secondCGImage); 
    CGImageRef result = CGBitmapContextCreateImage(ctx); 
    CGContextRelease(ctx); 
    // we presume result succeeded; it is NULL if it did not succeed for some reason 
    dispatc_async(dispatch_get_main_queue(), ^{ 
     // back on main thread we create the resulting UIImage 
     UIImage *image = [[UIImage alloc] initWithCGImage:result]; 
     CGImageRelease(result); 
     callback(image); // if a protocol, e.g. [thatObject didGenerateMergedImage:image]; 
     [image release]; 
    }); 
});