Iphone 如何绘制位图并使用Objective C将其快速显示在屏幕上?

Iphone 如何绘制位图并使用Objective C将其快速显示在屏幕上?,iphone,objective-c,bitmap,Iphone,Objective C,Bitmap,我对目标C不熟悉。 我正在尝试在位图上绘制(现在的基本线),然后在Iphone的屏幕上呈现位图 以下是我尝试的代码,它只显示一个空白屏幕: - (void)drawRect:(CGRect)rect { CGContextRef screen = UIGraphicsGetCurrentContext(); size_t width = rect.size.width; size_t height = rect.size.height; void *data = malloc(w

我对目标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);
这似乎是代码工作的唯一组合


有人有任何线索吗?

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

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

其他一些注意事项:

  • 您正在RGBA中设置笔划颜色,而不是根据您的注释设置CMYK,但您的结果是您想要的
  • 不要释放“screen”上下文——您不拥有它,因为您不是通过“create”方法获得它的
  • 我认为这里不需要刷新,但即使需要刷新,也要在发布“c”之后刷新它——如果需要,请确保在发布之前进行刷新
  • 您只在
    rect
    矩形内绘制。这在代码中可能很好,但请注意,此参数可以是视图边界的任何子矩形。如果要将图像blit到整个视图中,则应忽略
    rect
    参数,仅使用
    [自边界]
    作为绘图矩形
    首先,你可能会意识到,但你在这里做了额外的一步。虽然从概念上讲,这种方法是可行的,
    drawRect:
    获得了一个隐式的图形上下文(您知道如何使用
    UIGraphicsGetCurrentContext
    )并且可以直接绘制到该上下文中。无需创建位图上下文,然后将其blit到本地上下文中

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

    其他一些注意事项:

  • 您正在RGBA中设置笔划颜色,而不是根据您的注释设置CMYK,但您的结果是您想要的
  • 不要释放“screen”上下文——您不拥有它,因为您不是通过“create”方法获得它的
  • 我认为这里不需要刷新,但即使需要刷新,也要在发布“c”之后刷新它——如果需要,请确保在发布之前进行刷新
  • 您只在
    rect
    矩形内绘制。这在代码中可能很好,但请注意,此参数可以是视图边界的任何子矩形。如果要将图像blit到整个视图中,则应忽略
    rect
    参数,仅使用
    [自边界]
    作为绘图矩形
    这个drawRect代码真的被调用了吗?(您是否在其他地方进行了SETNEEDS显示?)

    drawRect的宽度和高度值是多少?你的画符合这些坐标吗

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

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

    增加:

    尝试使用iOS API设置颜色:

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

    这个drawRect代码真的被调用了吗?(您是否在其他地方进行了SETNEEDS显示?)

    drawRect的宽度和高度值是多少?你的画符合这些坐标吗

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

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

    增加:

    尝试使用iOS API设置颜色:

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

    嗨,吉诃多,我能够仅仅通过使用UIGraphicsGetCurrentContext进行绘制,但我希望在位图上进行绘制并渲染它。默认情况下,背景是白色的,我可以看到一个空白的白色屏幕,所以我相信我不需要对整个背景进行矩形填充。我认为代码是:CGImageRef img=cgitmapcontextcreateimage(c);应该将上下文c上的图纸连接到CGImageRef img,但我想这是没有发生的事情。谢谢你知道其他方法吗?或者你有iphone位图绘制的例子吗?@Nisarg:请看我所有的评论。您的方法应该很好,但还有其他几个考虑因素。位图上下文是垃圾数据,除非清除/填充它。可能是其他原因导致您看不到它。@Nisarg:同样,颜色是RGB,而不是CMYK。所以你现在提供完全透明的纯绿色,这是没有帮助的。你需要一些不透明度才能看到它。此外,您需要清除正在创建的位图上下文,而不是UIKit将为您清除的实际视图上下文。@quixoto:哦,是的,我知道它的RGB,