Même après avoir appliqué tout ce que j'ai mentionné, j'ai encore eu des drames avec les images. En fin de compte, je viens d'utiliser Gimp pour créer une version «verticale inversée» de toutes mes images. Désormais, je n'ai plus besoin d'utiliser de Transforms. Espérons que cela ne causera pas d'autres problèmes sur la piste.
Est-ce que quelqu'un sait pourquoi CGContextDrawImage dessinerait mon image à l'envers? Je charge une image depuis mon application:
Quartz2d utilise un système de coordonnées différent, où l'origine se trouve dans le coin inférieur gauche. Ainsi, lorsque Quartz dessine le pixel x [5], y [10] d'une image 100 * 100, ce pixel est dessiné dans le coin inférieur gauche au lieu du coin supérieur gauche. Ainsi provoquant l'image «retournée».
Le système de coordonnées x correspond, vous devrez donc inverser les coordonnées y.
CGContextTranslateCTM(context, 0, image.size.height);
Cela signifie que nous avons traduit l'image par 0 unité sur l'axe x et par la hauteur des images sur l'axe y. Cependant, cela seul signifiera que notre image est toujours à l'envers, étant simplement dessinée "image.size.height" ci-dessous où nous souhaitons qu'elle soit dessinée.
Le guide de programmation Quartz2D recommande d'utiliser ScaleCTM et de passer des valeurs négatives pour inverser l'image. Vous pouvez utiliser le code suivant pour ce faire -
CGContextScaleCTM(context, 1.0, -1.0);
Combinez les deux juste avant votre CGContextDrawImage
appel et vous devriez avoir l'image correctement dessinée.
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);
Faites juste attention si vos coordonnées imageRect ne correspondent pas à celles de votre image, car vous pouvez obtenir des résultats inattendus.
Pour reconvertir les coordonnées:
CGContextScaleCTM(context, 1.0, -1.0);
CGContextTranslateCTM(context, 0, -imageRect.size.height);