CGContextDrawImage рисует изображение вверх ногами при передаче UIImage.CGImage

Даже после того, как я применил ios все, что упомянул, у меня core-graphics остались драмы с изображениями. В cgcontextdrawimage конце концов, я только что cgcontextdrawimage использовал GIMP для создания iphone-os «перевернутой вертикальной» версии cocoa-touch-framework всех моих изображений. Теперь ios-sdk мне не нужно использовать cgcontextdrawimage какие-либо преобразования. Надеюсь, это cocoa-touch не вызовет в дальнейшем проблем.

Кто-нибудь cocoa-touch-framework знает, почему CGContextDrawImage core-graphics будет рисовать мои изображение core-graphics вверх ногами? Я загружаю изображение ios-sdk из моего приложения:

Quartz2d cocoa-touch использует другую систему iphone-os координат, где начало координат cocoa-touch-framework находится в нижнем левом quartz-graphics углу. Поэтому, когда Quartz cgcontextdrawimage рисует пиксель x [5], y [10] изображения cocoa-touch-framework размером 100 * 100, этот cocoa-touch-framework пиксель рисуется в нижнем cocoa-touch левом углу, а не в верхнем cocoa-touch-framework левом. Таким образом, получается ios "перевернутое" изображение.

Система cgcontextdrawimage координат x совпадает, поэтому cgcontextdrawimage вам нужно будет перевернуть apple-ios координаты y.

CGContextTranslateCTM(context, 0, image.size.height);

Это означает, что ios мы перевели изображение на cocoa-touch-framework 0 единиц по оси x и на высоту ios-sdk изображения по оси y. Однако ios-sdk это само по себе будет означать, что ios наше изображение все еще apple-ios перевернуто, просто нарисовано cocoa-touch «image.size.height» ниже ios-sdk того места, где мы хотим, чтобы iphone-os оно было нарисовано.

Руководство ios по программированию Quartz2D quartz-graphics рекомендует использовать cocoa-touch ScaleCTM и передавать отрицательные iphone-os значения для поворота изображения. Для quartz-graphics этого вы можете использовать cocoa-touch следующий код -

CGContextScaleCTM(context, 1.0, -1.0);

Объедините apple-ios эти два параметра непосредственно quartz-graphics перед вызовом CGContextDrawImage, и вы получите iphone-os изображение, нарисованное quartz-graphics правильно.

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);

Будьте осторожны, если cocoa-touch-framework координаты вашего imageRect ios не совпадают с координатами iphone-os вашего изображения, так как core-graphics вы можете получить непредвиденные cocoa-touch-framework результаты.

Чтобы преобразовать ios координаты обратно:

CGContextScaleCTM(context, 1.0, -1.0);
CGContextTranslateCTM(context, 0, -imageRect.size.height);

ios

cocoa-touch

core-graphics

cgcontextdrawimage

2022-10-30T22:47:09+00:00