Nawet po zastosowaniu wszystkiego, o czym wspomniałem, wciąż miałem dramaty z obrazami. Ostatecznie właśnie użyłem Gimpa do stworzenia wersji „odwróconej pionowej” wszystkich moich zdjęć. Teraz nie muszę używać żadnych transformacji. Mamy nadzieję, że nie spowoduje to dalszych problemów na późniejszym etapie.
Czy ktoś wie, dlaczego CGContextDrawImage rysuje mój obraz do góry nogami? Ładuję obraz z mojej aplikacji:
Quartz2d używa innego układu współrzędnych, którego pochodzenie znajduje się w lewym dolnym rogu. Kiedy więc Kwarc rysuje piksel x [5], y [10] obrazu 100 * 100, piksel ten jest rysowany w lewym dolnym rogu zamiast w lewym górnym rogu. Powodując w ten sposób „odwrócony” obraz.
Układ współrzędnych x pasuje, więc trzeba odwrócić współrzędne y.
CGContextTranslateCTM(context, 0, image.size.height);
Oznacza to, że przetłumaczyliśmy obraz o 0 jednostek na osi x i wysokość obrazów na osi y. Jednak to samo będzie oznaczać, że nasz obraz jest wciąż do góry nogami, po prostu zostanie narysowany „image.size.height” poniżej, gdzie chcemy go narysować.
Przewodnik po programowaniu Quartz2D zaleca stosowanie ScaleCTM i przekazywanie wartości ujemnych w celu odwrócenia obrazu. Aby to zrobić, możesz użyć następującego kodu -
CGContextScaleCTM(context, 1.0, -1.0);
Połącz dwa tuż przed CGContextDrawImage
rozmową, a obraz powinien być narysowany poprawnie.
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);
Należy zachować ostrożność, jeśli współrzędne imageRect nie pasują do współrzędnych obrazu, ponieważ można uzyskać niezamierzone wyniki.
Aby przekonwertować współrzędne z powrotem:
CGContextScaleCTM(context, 1.0, -1.0);
CGContextTranslateCTM(context, 0, -imageRect.size.height);