Selbst nachdem ich alles angewendet habe, was ich erwähnt habe, hatte ich immer noch Dramen mit den Bildern. Am Ende habe ich gerade Gimp verwendet, um eine "gespiegelte vertikale" Version aller meiner Bilder zu erstellen. Jetzt muss ich keine Transformationen mehr verwenden. Hoffentlich wird dies später keine weiteren Probleme verursachen.
Weiß jemand, warum CGContextDrawImage mein Bild verkehrt herum zeichnen würde? Ich lade ein Bild aus meiner Anwendung ein:
Quartz2d verwendet ein anderes Koordinatensystem, bei dem der Ursprung in der unteren linken Ecke liegt. Wenn Quarz also Pixel x [5], y [10] eines 100 * 100-Bildes zeichnet, wird dieses Pixel in der unteren linken Ecke anstatt in der oberen linken Ecke gezeichnet. Dadurch entsteht das "gespiegelte" Bild.
Das x-Koordinatensystem stimmt überein, daher müssen Sie die y-Koordinaten umdrehen.
CGContextTranslateCTM(context, 0, image.size.height);
Dies bedeutet, dass wir das Bild auf der x-Achse um 0 Einheiten und auf der y-Achse um die Bildhöhe verschoben haben. Dies allein bedeutet jedoch, dass unser Bild immer noch auf dem Kopf steht und nur "image.size.height" unten gezeichnet wird, wo wir es zeichnen möchten.
In der Quartz2D-Programmieranleitung wird empfohlen, ScaleCTM zu verwenden und negative Werte zu übergeben, um das Bild umzudrehen. Sie können dazu den folgenden Code verwenden:
CGContextScaleCTM(context, 1.0, -1.0);
Kombinieren Sie die beiden kurz vor Ihrem CGContextDrawImage
Anruf und Sie sollten das Bild richtig gezeichnet haben.
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);
Seien Sie nur vorsichtig, wenn Ihre imageRect-Koordinaten nicht mit denen Ihres Bildes übereinstimmen, da Sie unbeabsichtigte Ergebnisse erzielen können.
So konvertieren Sie die Koordinaten zurück:
CGContextScaleCTM(context, 1.0, -1.0);
CGContextTranslateCTM(context, 0, -imageRect.size.height);