2013-08-16 3 views
2

У меня есть контекст, на котором я выполнил рисунок. Теперь я хочу сохранить результат. Из-за перевернутого контекста оси у первого я хочу, чтобы перевернуть все, а затем создать образ:CGBitmapContextCreateImage on flipped context

// 1. Flip Y 
CGContextTranslateCTM(context, 0, height); 
CGContextScaleCTM(context, 1.0, -1.0); 

// 2. Create image 
CGImageRef rawMask = CGBitmapContextCreateImage(context); 

Однако изображение не переворачивается. Даже если я изменяю порядок действия 1 с 2, изображение все равно не переворачивается. Я не могу понять, почему и как это исправить. Более важным является «почему», потому что в моей логике, если я переворачиваю контекст с перевернутым рисунком, это должно быть хорошо.

ответ

2

CTM влияет на операции рисования, которые вы выполняете после установки CTM. То есть, изменение CTM может изменить, какие пиксели будут изменены ваши последующие операции рисования.

CTM не влияет на CGBitmapContextCreateImage напрямую. CGBitmapContextCreateImage просто копирует пиксели из контекста в изображение. Он вообще не смотрит на CTM.

Таким образом, вы опустили критическую часть своей программы из своего вопроса: часть, которая фактически изменяет пиксели. Правильный порядок:

// 1. Flip Y axis. 
CGContextTranslateCTM(context, 0, height); 
CGContextScaleCTM(context, 1.0, -1.0); 

// 2. Draw into context. For example: 
CGContextBeginPath(context); 
CGContextAddEllipseInRect(context, someRect); 
CGContextSetFillColorWithColor(context, ...); 
CGContextFillPath(context); 

// 3. Create image. 
CGImageRef rawMask = CGBitmapContextCreateImage(context); 
+0

Я сделал это наоборот, спасибо – Vive

0
CGContextRef context = UIGraphicsGetCurrentContext(); //Check if this is valid 

CGContextTranslateCTM(context, 0, height); 
CGContextScaleCTM(context, 1.0, -1.0); 

CGImageRef rawMask = CGBitmapContextCreateImage(context); 
UIImage* img = [UIImage imageWithCGImage:rawMask]; 
CGImageRelease(imgRef); 

Если UIGraphicsGetCurrenContext(); не действует, то:

Если вы просто хотите изображение: использовать UIGraphicsBeginImageContext(), чтобы создать контекст, то UIGraphicsGetImageFromCurrentImageContext() для извлечения UIImage (нет необходимости в посреднике CGImage), затем UIGraphicsEndImageContext() для очистки.

+0

Действительно, контекст 0x0. Как это возможно, я могу видеть изображение, которое я рисовал под rawMask? RawMask полностью совпадает с тем, что я рисовал на своем экране (не считая Y-flip). Когда контекст недействителен, CGBitmapContextCreateImage (контекст) не должен давать мне неправильный образ? Спасибо за ваше объяснение! – Vive

+0

Я думаю, что другой ответ здесь дает объяснение этому. Чтобы исправить проблему 0x0 контекста, используйте 'UIGraphicsBeginImageContext' или' UIGraphicsBeginImageContextWithOptions', чтобы запустить его, 'UIGraphicsGetImageFromCurrentImageContext()', чтобы извлечь UIImage и 'UIGraphicsEndImageContext()', когда вы закончите с ним, чтобы освободить контекст. – geekchic

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