CGContext:位图背景颜色:无法设置为白色:IOS

时间:2012-02-03 14:17:52

标签: ios bitmap core-graphics background-color cgcontext

我正在尝试修改一些简单的“创建绘图应用程序”代码,使其具有白色背景颜色,而不是设置为黑色。示例代码位于:

http://blog.effectiveui.com/?p=8105

我尝试过设置self.backgroundcolor = [UIColor whiteColor],[[UIColor whiteColor] setFill]也没有效果。由于我的经验不足,我遗失了一些非常基本的东西。

有没有人有任何想法?非常感谢提前!

3 个答案:

答案 0 :(得分:1)

我在drawRect中添加了几行,应该为你做。你是在正确的轨道上,但是当你将颜色设置为白色时,你实际上需要用它填充paintView矩形:

- (void)drawRect:(CGRect)rect {
    if(touch != nil){
        CGContextRef context = UIGraphicsGetCurrentContext();

        //clear background color to white
        [[UIColor whiteColor] setFill];
        CGContextFillRect(context, rect);

        hue += 0.005;
        if(hue > 1.0) hue = 0.0;
        UIColor *color = [UIColor colorWithHue:hue saturation:0.7 brightness:1.0 alpha:1.0];

        CGContextSetStrokeColorWithColor(context, [color CGColor]);
        CGContextSetLineCap(context, kCGLineCapRound);
        CGContextSetLineWidth(context, 15);

        CGPoint lastPoint = [touch previousLocationInView:self];
        CGPoint newPoint = [touch locationInView:self];

        CGContextMoveToPoint(context, lastPoint.x, lastPoint.y);
        CGContextAddLineToPoint(context, newPoint.x, newPoint.y);
        CGContextStrokePath(context);
    }
}

view.backgroundColor = [UIColor whiteColor];没有用的是任何实现drawRect的视图都忽略了backgroundColor属性,程序员负责绘制整个视图内容,包括背景。

答案 1 :(得分:1)

我认为你错过的部分是PaintView的这一部分:

 - (BOOL) initContext:(CGSize)size {

    int bitmapByteCount;
    int bitmapBytesPerRow;

    // Declare the number of bytes per row. Each pixel in the bitmap in this
    // example is represented by 4 bytes; 8 bits each of red, green, blue, and
    // alpha.
    bitmapBytesPerRow = (size.width * 4);
    bitmapByteCount = (bitmapBytesPerRow * size.height);

    // Allocate memory for image data. This is the destination in memory
    // where any drawing to the bitmap context will be rendered.
    cacheBitmap = malloc( bitmapByteCount );
    if (cacheBitmap == NULL){
        return NO;
    }
    cacheContext = CGBitmapContextCreate (cacheBitmap, size.width, size.height, 8, bitmapBytesPerRow, CGColorSpaceCreateDeviceRGB(), kCGImageAlphaNoneSkipFirst);
    return YES;
}

创建一个单独的上下文,它调用一个缓存,所有后续的触摸都被绘制。在视图的drawRect:中,它只是将缓存复制到输出。

它提供的一个标志 - kCGImageAlphaNoneSkipFirst - 指定缓存的上下文没有alpha通道。因此,当它被绘制时,无论其他因素如何,背景都无法显示出来;黑色来自cacheContext,就好像你用手指涂成黑色一样。

所以你真正想做的是在开始之前用白色填充cacheContext。您可以通过memsetting cacheBitmap数组来实现这一点,因为您已明确告知上下文存储其数据的位置,或者您可以使用适当的CGContextFillRect到cacheContext。

答案 2 :(得分:1)

如果你想使用源代码,但是你要创建的图像有明确的背景,并且在设置'inking'时 - 当你设置cachedBitmap时,就这样做。

cacheContext = CGBitmapContextCreate ( cacheBitmap
                                      , size.width
                                      , size.height
                                      , 8
                                      , bitmapBytesPerRow
                                      , CGColorSpaceCreateDeviceRGB()
                                      , kCGImageAlphaPremultipliedFirst
                                     );

这样,当您为“墨水”设置笔触颜色时,只会绘制“墨水”。确保图纸视图的背景颜色为clearColor,opaque设置为NO。

这意味着现在可以在此图纸视图下方或通过此图纸视图显示已添加图纸视图的视图。因此,将该视图的背景颜色设置为您想要的任何颜色,或者将UIImageView放在绘图视图后面,然后瞧!您可以插入带衬纸或方格纸或任何您想要的图像!