0

Я хочу обратить UIImage с CGAffineTransform, но это дает неправильный выход с CGContextConcatCTMDraw изображение с CGAffineTransform и CGContextDrawImage

Я пытаюсь с ниже код:

CGAffineTransform t = CGAffineTransformMake(1.67822, -1.38952, 1.38952, 1.67822, 278.684, 209.129); // transformation of uiimageview 
UIGraphicsBeginImageContext(CGSizeMake(1024, 768)); 
CGContextRef imageContext = UIGraphicsGetCurrentContext(); 
CGContextDrawImage(imageContext, dragView.frame, dragView.image.CGImage); 
CGContextConcatCTM(imageContext, t); 

NSLog(@"\n%@\n%@", NSStringFromCGAffineTransform(t),NSStringFromCGAffineTransform(CGContextGetCTM(imageContext))); 

Выход:

[1.67822, -1.38952, 1.38952, 1.67822, 278.684, 209.129] // imageview transformation 
    [1.67822, 1.38952, 1.38952, -1.67822, 278.684, 558.871] // drawn image transformation 

CGAffineTransform CGAffineTransformMake (
    CGFloat a, 
    CGFloat b, 
    CGFloat c, 
    CGFloat d, 
    CGFloat tx, 
    CGFloat ty 
); 

Изменены параметры b, d и ty, Как это решить?

+0

Как вы достигли этих ценностей в первую очередь? –

+0

Кроме того, изображение, отображаемое с ног на голову (или, наоборот, неправильный путь), или это только вывод журнала, о котором вы беспокоитесь? –

+0

Да, это только выход журнала – Nikkie

ответ

1

Нет проблем. Вывод журнала корректен.

Сравнение двух матриц, разница между ними заключается в следующем:

  • масштаб по вертикали на -1 (которая влияет на два из первых четырех членов)
  • переводят вертикально 349.742 (который влияет на последний член)

Я собираюсь угадать и сказать, что ваше мнение составляет около 350 пунктов. Я прав? На самом деле, 349.742 странно, так как вы устанавливаете высоту контекста на 768. Это почти половина (возможно, потому, что опорная точка центрирована?), Но очень короткая и отрезание строки состояния здесь не имеет смысла (и не будет учитывать разницу в 68,516 пунктов). Так что это головоломка. Но, что следует за этим:

Вертикальная шкала и перевод how you would flip a context. Этот контекст перешел от левого нижнего происхождения к верхнему левому началу или наоборот.

Это произошло до того вы каскадный ваши (необъяснимые, жестко запрограммированный) матрицы в. Предполагая, что вы не переворачивать контексту себя, он, вероятно, пришел тот путь (я думаю, как деталь реализации UIKit).

Конкатенация (как в CGContextConcatCTM) не заменяет старую матрицу преобразования новой; это матричное умножение. Матрица, которую вы получили после этого, является продуктом как матрицы, с которой вы начали, так и той, которую вы связали с ней. Получившаяся матрица будет перевернута, а затем ... независимо от вашей матрицы.

Вы можете сами это увидеть, просто получив CTM, прежде чем конкатенировать свою матрицу и зарегистрировать ее. Вы должны увидеть это:

[0, -1, 0, -1, 0, 349.742] 

См. Также “The Math Behind the Matrices” in the Quartz 2D Programming Guide.

Смежные вопросы