Incluso después de aplicar todo lo que he mencionado, todavía he tenido dramas con las imágenes. Al final, acabo de usar Gimp para crear una versión 'vertical invertida' de todas mis imágenes. Ahora no necesito usar ninguna Transformación. Esperemos que esto no cause más problemas en el futuro.
¿Alguien sabe por qué CGContextDrawImage dibujaría mi imagen al revés? Estoy cargando una imagen desde mi aplicación:
Quartz2d utiliza un sistema de coordenadas diferente, donde el origen está en la esquina inferior izquierda. Entonces, cuando Quartz dibuja el píxel x [5], y [10] de una imagen de 100 * 100, ese píxel se dibuja en la esquina inferior izquierda en lugar de la superior izquierda. Causando así la imagen 'volteada'.
El sistema de coordenadas x coincide, por lo que deberá voltear las coordenadas y.
CGContextTranslateCTM(context, 0, image.size.height);
Esto significa que hemos traducido la imagen por 0 unidades en el eje xy por la altura de las imágenes en el eje y. Sin embargo, esto solo significará que nuestra imagen todavía está al revés, simplemente dibujada "image.size.height" debajo de donde deseamos que se dibuje.
La guía de programación Quartz2D recomienda usar ScaleCTM y pasar valores negativos para voltear la imagen. Puede usar el siguiente código para hacer esto:
CGContextScaleCTM(context, 1.0, -1.0);
Combine los dos justo antes de su CGContextDrawImage
llamada y debería tener la imagen dibujada correctamente.
UIImage *image = [UIImage imageNamed:@"testImage.png"];
CGRect imageRect = CGRectMake(0, 0, image.size.width, image.size.height);
CGContextTranslateCTM(context, 0, image.size.height);
CGContextScaleCTM(context, 1.0, -1.0);
CGContextDrawImage(context, imageRect, image.CGImage);
Solo tenga cuidado si sus coordenadas imageRect no coinciden con las de su imagen, ya que puede obtener resultados no deseados.
Para volver a convertir las coordenadas:
CGContextScaleCTM(context, 1.0, -1.0);
CGContextTranslateCTM(context, 0, -imageRect.size.height);