Anche dopo aver applicato tutto ciò che ho menzionato, ho ancora avuto dei drammi con le immagini. Alla fine, ho appena usato Gimp per creare una versione "capovolta verticale" di tutte le mie immagini. Ora non ho bisogno di usare nessuna trasformazione. Spero che questo non causi ulteriori problemi lungo il percorso.
Qualcuno sa perché CGContextDrawImage avrebbe disegnato la mia immagine sottosopra? Sto caricando un'immagine dalla mia applicazione:
Quartz2d utilizza un diverso sistema di coordinate, in cui l'origine è nell'angolo in basso a sinistra. Quindi quando Quartz disegna pixel x [5], y [10] di un'immagine 100 * 100, quel pixel viene disegnato nell'angolo in basso a sinistra invece che in alto a sinistra. Provocando così l'immagine "capovolta".
Il sistema di coordinate x corrisponde, quindi dovrai capovolgere le coordinate y.
CGContextTranslateCTM(context, 0, image.size.height);
Ciò significa che abbiamo tradotto l'immagine di 0 unità sull'asse x e dell'altezza delle immagini sull'asse y. Tuttavia, questo da solo significherà che la nostra immagine è ancora sottosopra, appena disegnata "image.size.height" sotto dove vorremmo che fosse disegnata.
La guida alla programmazione di Quartz2D raccomanda l'uso di ScaleCTM e il passaggio di valori negativi per capovolgere l'immagine. Puoi usare il seguente codice per fare questo -
CGContextScaleCTM(context, 1.0, -1.0);
Combina i due appena prima della tua CGContextDrawImage
chiamata e dovresti avere l'immagine disegnata correttamente.
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);
Fai solo attenzione se le tue coordinate imageRect non corrispondono a quelle della tua immagine, in quanto puoi ottenere risultati indesiderati.
Per riconvertire le coordinate:
CGContextScaleCTM(context, 1.0, -1.0);
CGContextTranslateCTM(context, 0, -imageRect.size.height);