2009-08-10 18 views
7

Tengo la sensación de que esta no es una tarea fácil, pero necesito combinar o aplanar un UIImageView con otra vista de UIImage sobre ella. Por ejemplo: tengo dos UIImageViews. Uno de ellos tiene un UIImage de un campo cubierto de hierba (1200 x 1200 píxeles). El otro es un UIImage de una pelota de baloncesto (128 x 128 píxeles), y se coloca encima de la imagen del campo de hierba de tal manera que la pelota de baloncesto parece estar en el campo de hierba. Quiero poder GUARDAR las UIImageViews superpuestas como un solo archivo de imagen en mi álbum de fotos, lo que significa que tendré que combinar las dos imágenes de alguna manera. ¿Cómo se lograría esto? (NOTA: Tomar una captura de pantalla (320 x 480 píxeles) no sería una solución aceptable como deseo de conservar el tamaño de 1200 x 1600 pixeles¿Cómo 'aplanar' múltiples UIImageViews en UNO?

PREGUNTA:.
Cómo puedo aplanar múltiples UIImageViews en uno y SAVE la imagen resultante mientras se conserva el tamaño/resolución

Respuesta

3

Esto toma cualquier vista y hace un UIImage fuera de ella. Cualquier vista y sus subvistas se "aplanan" en un UIImage que puede mostrar o guardar en el disco.

- (UIImage*)imageFromView{ 

    UIImage *image; 

    UIGraphicsBeginImageContext(self.view.bounds.size); 
    [self.view.layer renderInContext:UIGraphicsGetCurrentContext()]; 
    image = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 

    return image; 

} 
+0

Por cierto, Corey, ¿hay alguna manera de hacer esto (el código anterior) mientras se conserva la resolución de la imagen de la vista que es la capa base (self.view.layer en tu código)? Tengo una foto de 1200 x 1600, pero después del procesamiento (usando tu código) la imagen resultante tiene el tamaño de píxel del UIImageView que era su contenedor (320 x 427). – RexOnRoids

+0

No puedo decirlo con certeza, pero la táctica utilizada por el tequilatango parece lograr esto. El método que uso solo capturará lo que está en pantalla en la resolución de las pantallas. Es rápido y sucio, pero funciona. Si necesita mejores resultados, tendrá que dibujar la imagen en el búfer como lo ilustró. Por supuesto, dado que este es el iPhone, si hay una manera de que disminuya el tamaño de sus imágenes sin afectar el UX, entonces puede considerarlo por razones de memoria/rendimiento. –

+0

Para mantener la resolución de la imagen solo use 'UIGraphicsBeginImageContextWithOptions (self.view.bounds.size, NO, 0.0)' –

5

¿Por qué no dibuja UIImages originales en un búfer de fondo uno encima del otro y luego escribe una imagen combinada en un archivo? A continuación se muestra un ejemplo de cómo puede dibuja dos imágenes en el mismo buffer:

CGImageRef bgimage = [bguiimage CGImage]; 
width = CGImageGetWidth(bgimage); 
height = CGImageGetHeight(bgimage); 

// Create a temporary texture data buffer 
GLUbyte* data = (GLubyte *) malloc(width * height * 4); 
assert(data); 

// Draw image to buffer 
CGContextRef ctx = CGBitmapContextCreate(data, width, height, 8, width * 4, CGImageGetColorSpace(image), kCGImageAlphaPremultipliedLast); 
assert(ctx); 

// Flip image upside-down because OpenGL coordinates differ 
CGContextTranslateCTM(ctx, 0, height); 
CGContextScaleCTM(ctx, 1.0, -1.0); 

CGContextDrawImage(ctx, CGRectMake(0, 0, (CGFloat)width, (CGFloat)height), bgimage); 

CGImageRef ballimage = [balluiimage CGImage]; 
bwidth = CGImageGetWidth(ballimage); 
bheight = CGImageGetHeight(ballimage); 

float x = (width - bwidth)/2.0; 
float y = (height - bheight)/2.0; 
CGContextDrawImage(ctx, CGRectMake(x, y, (CGFloat)bwidth, (CGFloat)bheight), ballimage); 

CGContextRelease(ctx); 
+0

Gracias por esta sugerencia. ¿Esto conserva la resolución/píxeles de las imágenes originales o terminan teniendo el mismo tamaño que las vistas que los mantienen? – RexOnRoids

+0

Conserva la resolución, porque dibuja la imagen original. –

Cuestiones relacionadas