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

R3D*_*vil 1 iphone bitmap objective-c

我是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);  
}
Run Code Online (Sandbox Code Playgroud)

如果有人可以指出类似的示例或建议更改我的代码,请告诉我.


感谢大家的帮助......代码可以工作,但不是预期的.

我修改了代码如下:

CGContextSetRGBFillColor(screen, 1.0, 1.0, 1.0, 1.0); //code works without these 3 lines
CGContextFillRect(screen, rect);
CGContextDrawImage(screen, rect, img);
Run Code Online (Sandbox Code Playgroud)

但是有一些奇怪的事情发生了,当我提供的颜色为绿色时,我可以看到画出的黑线.以下是创建位图上下文后的代码:

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

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

有没有人有任何线索?

Ben*_*tto 5

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

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

其他几点说明:

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