【问题标题】:CGContext: Bitmap Background Color: Cannot set to white: IOSCGContext:位图背景颜色:无法设置为白色:IOS
【发布时间】:2012-02-03 14:17:52
【问题描述】:

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

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

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

有人有什么想法吗?非常感谢!

【问题讨论】:

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


    【解决方案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 属性,程序员负责绘制整个视图内容,包括背景。

    【讨论】:

    • 谢谢尼克。我试过这个,由于某种原因它不起作用。链接末尾的页面中有几个绘图应用程序的示例,我使用的是更高级的版本,它使用贝塞尔函数产生漂亮的曲线。从下面的帖子中我认为我需要将缓存上下文设置为白色开始?
    • 如果您使用链接中的最后一个示例,您可能需要将我在上面添加的两行放在 -drawToCache 方法中。
    【解决方案2】:

    我认为您错过的部分是 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。

    【讨论】:

    • 嗨,汤米,谢谢。如果我想沿着 memmsetting 路线走,你能告诉我如何将 cacheBitmap 数组强制为白色吗?干杯。
    • @LeeBarringer 你会在 malloc'd cacheBitmap 之后的任何地方快速输入memset(cacheBitmap, 255, bitmapByteCount)。可以使用简单的 memset 设置白色,因为您已明确规定位图上下文应存储其像素的位置,并且白色是所有通道设置为相同值的颜色。
    • Tommy,把它修好了。非常感谢。事实上,我正在尝试为我的应用程序制作一个简单的“签名捕获”功能......所以白底黑字是完美的。干杯。
    • 你能告诉我,如果我希望绘制视图是清晰的颜色,那么绘制视图后面的视图上的图像是可见的,并且看起来像在图像上绘画
    • @Dinesh Kaushik 是的,您可以 - 在设置缓存上下文时执行此操作: cacheContext = CGBitmapContextCreate ( cacheBitmap , size.width , size.height , 8 , bitmapBytesPerRow , CGColorSpaceCreateDeviceRGB() , kCGImageAlphaPremultipliedFirst );
    【解决方案3】:

    如果您想使用源代码,但对正在创建和“上墨”的图像有清晰的背景 - 当您设置 cachedBitmap 时,请这样做。

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

    这样,当您为“墨水”设置笔触颜色时,只会绘制“墨水”。确保绘图 View 也有一个 clearColor 的背景色,并且 opaque 设置为 NO。

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

    【讨论】:

      猜你喜欢
      • 2021-03-23
      • 1970-01-01
      • 1970-01-01
      • 2012-06-04
      • 2014-03-29
      • 2020-01-26
      • 2013-01-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多