2011-03-31 35 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

相关问题