2011-03-31 64 views
1

我是新來的客觀C. 我想畫(到現在爲止的基本線)到位圖上,然後在屏幕上呈現Iphone的位圖。如何繪製位圖並使用Objective C將其粘貼到屏幕上?

以下是我試過的代碼,它表明我只是一個空白屏幕:

- (void)drawRect:(CGRect)rect 
{ 

CGContextRef screen = UIGraphicsGetCurrentContext();  
size_t width = rect.size.width; 

size_t height = rect.size.height; 

void *data = malloc(width*height*4); 

CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); 

CGContextRef c = CGBitmapContextCreate(data, width, height, 8, width*4, colorSpace, kCGImageAlphaPremultipliedFirst); 

CGFloat black[4] = {0.0f,0.0f,0.0f,1.0f}; // setting the color in CMYK format 

CGContextSetStrokeColor(c, black); 

CGContextBeginPath(c); 

CGContextMoveToPoint(c, 5.0f, 5.0f); 

CGContextAddLineToPoint(c, 50.0f, 50.0f); 

CGContextAddLineToPoint(c, 100.0f, 60.0f); 

CGContextMoveToPoint(c, 100.0f, 100.0f); 

CGContextAddLineToPoint(c, 50.0f, 150.0f); 

CGContextStrokePath(c); 

CGImageRef img = CGBitmapContextCreateImage(c); 

CFRelease(c); 

free(data); 

CGContextDrawImage(screen, rect, img); 

CGContextFlush(screen); 

CGContextFlush(c); 

CFRelease(colorSpace); 

CGImageRelease(img); 

CFRelease(screen); 
} 

讓我知道,如果有人能指出一個類似的例子或建議改變我的代碼。


感謝您的幫助大家... 代碼工作,但並不如預期。

我修改了代碼如下:

CGContextSetRGBFillColor(screen, 1.0, 1.0, 1.0, 1.0); //code works without these 3 lines 
CGContextFillRect(screen, rect); 
CGContextDrawImage(screen, rect, img); 

但有一些奇怪的事情發生,我可以看到當我提供的顏色是綠色的黑線繪製。 下面是創建位圖上下文之後代碼:

CGFloat black[4] = {0.0f,1.0f,0.0f,1.0f}; //RGB values 
CGContextSetStrokeColor(c, black); 

這似乎是它的代碼工作的唯一組合...

沒有人有任何線索?

回答

5

首先,您可能會意識到,但您在此處做了一個額外的步驟。儘管概念上這種方法可行,但drawRect:會得到一個隱式圖形上下文(您知道如何使用UIGraphicsGetCurrentContext),並且您可以直接繪製該上下文。沒有必要創建位圖上下文,然後將其上傳到本地上下文中。

也就是說,你的代碼通常看起來很合理。然而,你可以用黑色繪畫,而不用清除任何其他的背景,這可能解釋全黑的結果。 (底層位距離的malloc的未初始化的內存,除非你做一個明確清晰或填充就可以了。)嘗試在整個上下文中做一個矩形,填充爲白色,或等

其他一些注意事項:

  1. 您正在設置RGBA中的筆觸顏色,而不是您的評論中的CMYK,但是結果是您想要的。
  2. 不要發佈「屏幕」上下文 - 你不擁有它,因爲你沒有通過「創建」方法得到它。
  3. 我不認爲這裏需要刷新,但即使他們是,你釋放它後沖洗「C」 - 確保你以前做過,如果你想。
  4. 您只在rect矩形內繪圖。這在代碼中可能沒問題,但請注意,該參數可以是視圖邊界的任何子節點。如果您的目的是將圖像粘貼到整個視圖中,則應忽略rect參數,並將[self bounds]用作繪圖矩形。
+0

嗨Quixoto, 我能夠通過使用UIGraphicsGetCurrentContext只畫,但我希望做一個位圖並對其進行渲染。 默認背景是白色,我可以看到一個空白的白色屏幕,所以我相信我不需要在整個上下文中做一個矩形填充。我想代碼: 我認爲代碼: CGImageRef img = CGBitmapContextCreateImage(c); 應該得到CGImageRef img上下文c上的圖紙,但我想這就是什麼沒有發生。 謝謝 – R3D3vil 2011-03-31 15:21:45

+0

你知道任何其他方式或有一個iphone位圖繪製的例子嗎? – R3D3vil 2011-03-31 15:40:28

+0

@Nisarg:請參閱我的所有評論。你的方法應該沒問題,但還有其他一些考慮因素。除非清除/填充它,否則您的位圖上下文是垃圾數據。別的東西可能會導致你看不到。 – 2011-03-31 15:53:24

0

這個drawRect代碼實際上是否被調用? (你有沒有在其他地方做setNeedsDisplay?)

drawRect獲取寬度和高度的值是什麼?你的繪圖是否適合這些座標?

此外,您可能正在繪製黑色線條到最初的黑色(0,0,0)位圖。嘗試不同的顏色(例如紅色)。

您還可以將位圖數據的字節轉儲到文件中,並查看它們是如何初始化的,以及它們是否由繪圖命令更改。

增加:

嘗試使用的iOS API設置你的顏色:

CGContextSetRGBFillColor(c, 1.0, 0.0, 0.0, 1.0); // RGBA 
+0

是的,改變顏色值有助於......但它不是我所期望的......請引用我的最新帖子......謝謝 – R3D3vil 2011-03-31 17:35:05