2013-08-16 41 views
2

我有一個上下文,我已經執行了一些繪圖。現在我想保存一個結果。由於上下顛倒y軸首先我想翻轉一切,然後創建圖像:CGBitmapContextCreateImage翻轉上下文

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

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

但是圖像沒有翻轉。即使我用2更改動作1的順序,圖像仍然不會翻轉。我無法理解爲什麼以及如何解決它。更重要的是'爲什麼',因爲在我的邏輯中,如果我翻轉上下顛倒的上下文,它應該沒問題。

回答

2

CTM影響您在設置CTM後執行的繪圖操作。也就是說,改變CTM可以改變後續繪製操作修改哪些像素。

CTM不直接影響CGBitmapContextCreateImageCGBitmapContextCreateImage只是將上下文中的像素複製到圖像中。它根本沒有看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形翻轉)。當上下文無效時,CGBitmapContextCreateImage(上下文)不應該給我錯誤的圖像?謝謝你的解釋! – Vive

+0

我認爲這裏的其他答案提供瞭解釋。要解決上下文0x0問題,使用'UIGraphicsBeginImageContext'或'UIGraphicsBeginImageContextWithOptions'來啓動一個,'UIGraphicsGetImageFromCurrentImageContext()'提取UIImage和'UIGraphicsEndImageContext()',當你完成它以釋放上下文時。 – geekchic