如何绘制位图并使用Objective C将其blit到屏幕上?

时间:2011-03-31 14:56:12

标签: iphone objective-c bitmap

我是Objective C的新手。 我试图将(现在的基本行)绘制到位图上,然后在屏幕上为Iphone绘制位图。

以下是我试过的代码,它只显示空白屏幕:

- (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);

这似乎是代码工作的唯一组合......

有没有人有任何线索?

2 个答案:

答案 0 :(得分:5)

首先,你可能知道,但你在这里做了一个额外的步骤。虽然从概念上讲这种方法是有效的,drawRect:会得到一个隐含的图形上下文(你知道如何使用UIGraphicsGetCurrentContext),你可以直接绘制它。之后无需创建位图上下文然后将其blit到本地上下文中。

那就是说,你的代码通常看起来很合理。然而,你在绘制黑色而没有将背景清除为其他任何东西,这可能解释了全黑的结果。 (基础位图只是来自malloc的未初始化的内存,除非你做一个明确的清除或填充它。)尝试对整个上下文进行矩形填充为白色等等。

其他几点说明:

  1. 您根据评论设置了RGBA中的笔触颜色,而不是CMYK,但您的结果就是您想要的结果。
  2. 不要发布“屏幕”上下文 - 你没有拥有它,因为你没有通过“创建”方法获得它。
  3. 我不认为这里需要冲洗,但即使它们是,你释放后也会冲洗“c” - 如果你愿意,请确保你这样做。
  4. 您只在rect矩形内绘图。这可能在您的代码中很好,但请注意,此参数可以是视图边界的任何子矩形。如果您打算将图像blit到整个视图中,则应忽略rect参数,并使用[self bounds]作为绘图矩形。

答案 1 :(得分:0)

这个drawRect代码实际上是否被调用? (你在其他地方做过setNeedsDisplay吗?)

drawRect获取宽度和高度的值是多少?你的绘图是否适合这些坐标?

此外,您可能会在最初的黑色(0,0,0)位图上绘制黑线。尝试不同的颜色(例如红色)。

您还可以将位图数据的字节转储到文件中,看看它们是如何初始化的,以及它们是否会被绘图命令更改。

增加:

尝试使用iOS API设置颜色:

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