2012-04-23 8 views
5

He estado intentando esto por unos días. Estoy creando un cargador de hojas de sprites, sin embargo, también debo poder cargar los sprites en la dirección opuesta. Esto implica voltear las imágenes que ya he cargado.¿Qué pasa con la forma en que he intentado voltear (reflejar) un UIImage?

Ya he intentado hacer esto utilizando el método UIImageOrientation/UIImageOrientationUpMirrored, pero esto no tiene ningún efecto y simplemente dibuja el marco con la misma orientación exacta que antes.

Desde entonces he intentado una forma un poco más complicada que incluiré a continuación. Pero aún así, simplemente dibuja la imagen exactamente de la misma manera en que se carga en la aplicación. (No duplicado).

He incluido el método a continuación (junto con mis comentarios para que pueda seguir mi patrón de pensamiento), ¿puede ver lo que estoy haciendo mal?

- (UIImage*) getFlippedFrame:(UIImage*) imageToFlip 
{ 
//create a context to draw that shizz into 
UIGraphicsBeginImageContext(imageToFlip.size); 
CGContextRef currentContext = UIGraphicsGetCurrentContext(); 



//WHERE YOU LEFT OFF. you're attempting to find a way to flip the image in imagetoflip. and return it as a new UIimage. But no luck so far. 
[imageToFlip drawInRect:CGRectMake(0, 0, imageToFlip.size.width, imageToFlip.size.height)]; 

//take the current context with the old frame drawn in and flip it. 
CGContextScaleCTM(currentContext, -1.0, 1.0); 

//create a UIImage made from the flipped context. However will the transformation survive the transition to UIImage? UPDATE: Apparently not. 

UIImage* flippedFrame = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 

return flippedFrame; 
} 

Gracias, Guy.

Respuesta

6

Hubiera esperado que tuviera que cambiar la transformación del contexto y luego dibujar. Además, lo que se necesita para traducir, ya que están hojeando a coordenadas negativas, así, reemplace

[imageToFlip drawInRect:CGRectMake(0, 0, imageToFlip.size.width, imageToFlip.size.height)]; 
CGContextScaleCTM(currentContext, -1.0, 1.0); 

con (editado basado en los comentarios)

CGContextTranslateCTM(currentContext, imageToFlip.size.width, 0);  
CGContextScaleCTM(currentContext, -1.0, 1.0); 
[imageToFlip drawInRect:CGRectMake(0, 0, imageToFlip.size.width, imageToFlip.size.height)]; 

NOTA: A partir de los comentarios, una categoría para usar

@implementation UIImage (Flip) 
    - (UIImage*)horizontalFlip { 
    UIGraphicsBeginImageContext(self.size); 
    CGContextRef current_context = UIGraphicsGetCurrentContext();       
    CGContextTranslateCTM(current_context, self.size.width, 0); 
    CGContextScaleCTM(current_context, -1.0, 1.0); 
    [self drawInRect:CGRectMake(0, 0, self.size.width, self.size.height)]; 
    UIImage *flipped_img = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 
    return flipped_img; 
    } 
@end 
+0

Anteriormente había intentado algo como esto, sin embargo, creo que me confundí y traduje el contexto en la dirección incorrecta (-imagetoflip.size.width). También traduje ENTONCES escalado. Esto hizo que la imagen desapareciera cuando finalmente se dibujó. Su sugerencia hace lo mismo, sin embargo, creo que me pone en el camino correcto, ya que al menos cambia la imagen. Tal vez sea solo cuestión de que modifique la traducción hasta que encuentre lo que estoy buscando. –

+0

Además, si conoce un poco acerca de los gráficos centrales, ¿le importaría decirme por qué transformamos el contexto ENTONCES? Hubiera pensado que dibujaste en el contexto y luego transformaste el contexto para transformarlos a los dos juntos, pero aparentemente esto es incorrecto. –

+0

Ah, y gracias. –