【问题标题】:How to draw into a bitmap and blit it on to the screen using Objective C?如何使用Objective C绘制位图并将其粘贴到屏幕上?
【发布时间】:2011-03-31 14:56:11
【问题描述】:

我是 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);

这似乎是代码适用的唯一组合...

有人知道吗?

【问题讨论】:

    标签: iphone objective-c bitmap


    【解决方案1】:

    首先,您可能已经意识到了,但您在这里做了一个额外的步骤。尽管从概念上讲这种方法可行,但drawRect: 获得了一个隐式图形上下文(您知道如何使用UIGraphicsGetCurrentContext 获得)并且您可以直接在其中绘制。无需创建位图上下文,然后再将其 blit 到本地上下文中。

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

    其他几点说明:

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

    【讨论】:

    • 您好 Quixoto,我可以使用 UIGraphicsGetCurrentContext 进行绘制,但我希望在位图上进行绘制并进行渲染。背景默认为白色,我可以看到一个空白的白色屏幕,所以我相信我不需要对整个上下文进行矩形填充。我认为代码:CGImageRef img = CGBitmapContextCreateImage(c);应该将上下文 c 上的图纸添加到 CGImageRef img,但我想那是没有发生的事情。谢谢
    • 你知道其他方法或有iphone位图绘制的例子吗?
    • @Nisarg:请查看我所有的 cmets。您的方法应该没问题,但还有其他几个考虑因素。您的位图上下文是垃圾数据,除非/直到您清除/填充它。可能是其他原因导致您看不到这一点。
    • @Nisarg:同样,颜色是 RGB,而不是 CMYK。所以你现在提供的是完全透明的纯绿色,这没有帮助。你想要一些不透明度来看到它。此外,您需要清除您正在创建的 bitmap 上下文,而不是 UIKit 将为您清除的实际视图上下文。
    • @quixoto:哦,是的,我意识到它的 RGB,对此感到抱歉。现在我更困惑了...我看到一条带有以下代码的黑线: CGFloat black[4] = {0.0f,1.0f,0.0f,1.0f}; CGContextSetRGBFillColor(屏幕, 0.0, 0.0, 0.0, 0.0);
    【解决方案2】:

    这个 drawRect 代码真的被调用了吗? (你在其他地方做了 setNeedsDisplay 吗?)

    drawRect 的宽度和高度是什么值?您的绘图是否适合这些坐标?

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

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

    添加:

    尝试使用 iOS API 设置颜色:

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

    【讨论】:

    • 是的,改变颜色值有帮助......但这不是我所期望的......请参考我的最新帖子......谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多