Даже после того, как я применил все, что упомянул, у меня остались драмы с изображениями. В конце концов, я только что использовал GIMP для создания «перевернутой вертикальной» версии всех моих изображений. Теперь мне не нужно использовать какие-либо преобразования. Надеюсь, это не вызовет дальнейших проблем в будущем.
Кто-нибудь знает, почему CGContextDrawImage рисует мое изображение вверх ногами? Я загружаю изображение из своего приложения:
Quartz2d использует другую систему координат, где начало координат находится в нижнем левом углу. Поэтому, когда Quartz рисует пиксель x [5], y [10] изображения размером 100 * 100, этот пиксель рисуется в нижнем левом углу, а не в верхнем левом. Таким образом, вызывая «перевернутое» изображение.
Система координат x совпадает, поэтому вам нужно будет перевернуть координаты y.
CGContextTranslateCTM(context, 0, image.size.height);
Это означает, что мы переместили изображение на 0 единиц по оси x и на высоту изображения по оси y. Однако это само по себе будет означать, что наше изображение все еще перевернуто, просто нарисовано «image.size.height» ниже того места, где мы хотим, чтобы оно было нарисовано.
Руководство по программированию Quartz2D рекомендует использовать ScaleCTM и передавать отрицательные значения, чтобы перевернуть изображение. Для этого вы можете использовать следующий код -
CGContextScaleCTM(context, 1.0, -1.0);
Объедините эти два параметра непосредственно перед вашим CGContextDrawImage
вызовом, и вы получите изображение, нарисованное правильно.
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);
Только будьте осторожны, если ваши координаты imageRect не совпадают с координатами вашего изображения, так как вы можете получить непредвиденные результаты.
Чтобы преобразовать координаты обратно:
CGContextScaleCTM(context, 1.0, -1.0);
CGContextTranslateCTM(context, 0, -imageRect.size.height);
person
Cliff Viegas
schedule
04.02.2009