Anche dopo l'applicazione di tutto quello che ho detto, ho ancora avuto drammi con le immagini. Alla fine, ho appena usato Gimp per creare una versione 'capovolto verticale' di tutte le mie immagini. Ora non ho bisogno di utilizzare tutte le trasformazioni. Speriamo che questo non causerà ulteriori problemi lungo la pista.
Qualcuno sa perché CGContextDrawImage sarebbe disegnando la mia immagine a testa in giù? Sto caricando un'immagine in dalla mia applicazione:
Quartz2d utilizza un diverso sistema di coordinate, dove l'origine è nell'angolo inferiore sinistro. Così, quando quarzo disegna pixel x [5], y [10] di un'immagine a 100 * 100, tale pixel viene disegnato nell'angolo inferiore sinistro anziché in alto a sinistra. provocando così l'immagine 'ribaltata'.
Il sistema di x coordinare corrisponde, quindi è necessario capovolgere le coordinate y.
CGContextTranslateCTM(context, 0, image.size.height);
Ciò significa che abbiamo tradotto l'immagine da 0 unità sull'asse x e dall'altezza immagini sull'asse y. Tuttavia, questo da solo significa la nostra immagine è ancora a testa in giù, solo in fase di elaborazione "image.size.height" sotto dove vogliamo che da trarre.
La guida di programmazione Quartz2D consiglia di utilizzare ScaleCTM e passando valori negativi per capovolgere l'immagine. È possibile utilizzare il seguente codice per fare questo -
CGContextScaleCTM(context, 1.0, -1.0);
Combinare i due poco prima CGContextDrawImagechiamata e si dovrebbe avere l'immagine disegnata in modo corretto.
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);
Basta essere attenti se il vostro imageRect coordinate non corrispondono a quelle dell'immagine, come si può ottenere risultati imprevisti.
Per riconvertire le coordinate:
CGContextScaleCTM(context, 1.0, -1.0);
CGContextTranslateCTM(context, 0, -imageRect.size.height);