我是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);
这似乎是代码工作的唯一组合......
有没有人有任何线索?
答案 0 :(得分:5)
首先,你可能知道,但你在这里做了一个额外的步骤。虽然从概念上讲这种方法是有效的,drawRect:
会得到一个隐含的图形上下文(你知道如何使用UIGraphicsGetCurrentContext
),你可以直接绘制它。之后无需创建位图上下文然后将其blit到本地上下文中。
那就是说,你的代码通常看起来很合理。然而,你在绘制黑色而没有将背景清除为其他任何东西,这可能解释了全黑的结果。 (基础位图只是来自malloc的未初始化的内存,除非你做一个明确的清除或填充它。)尝试对整个上下文进行矩形填充为白色等等。
其他几点说明:
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