在iOS中混合图像

时间:2012-04-15 04:40:46

标签: objective-c ios transparency

Transparent Colored

我有两个名为Transparent and Colored的图像,如上所示。我想

  1. 首先显示透明图像
  2. 当用户触摸屏幕时,在手指笔划上显示彩色图像。
  3. 这是我的drawRect代码。

    - (void) drawRect:(CGRect)rect
    {
        [[UIColor redColor] set];
        CGContextRef context1 = UIGraphicsGetCurrentContext();
        UIImage *colorImage = [UIImage imageNamed:@"color.png"];
        UIImage *bwImage    = [UIImage imageNamed:@"transparent.png"];    
        CGContextSetBlendMode(context1, kCGBlendModeSourceAtop);
    
        // Draw the finger Strokes
        for (UIBezierPath *path in [touchPaths allValues]) {
        [path stroke];
    
        }
    
    CGContextDrawImage(context1, rect, colorImage.CGImage);
    CGContextDrawImage(context1, rect, bwImage.CGImage);    
    UIGraphicsEndImageContext();    
    

    }

    上面的代码只会创建一个空白屏幕。我在这做错了什么?请帮帮我。

2 个答案:

答案 0 :(得分:2)

在单个视图中使用drawRect方法意味着每次用户绘制内容时,您都需要绘制两个图像和一个贝塞尔曲线路径。这将是非常低效的。您需要一种方法将图像和绘图区域存储在不同的位置。

CALayer很适合这类问题。您可以将图像存储在图层中,并将用户的绘图蒙版设置为其中一个图层。从CALayer Class Reference开始,包括示例。

对于真正流畅的绘图,你是OpenGL - 虽然需要做更多的工作才能做好。请参阅Apple的GLPaint示例。


至于为什么这段代码不起作用,它确实绘制了两个图像。但是,绘制的第二张图像将为transparentImage。你的附件暗示这是不透明的灰色。这将使您的视图充满灰色,似乎什么都不做。如果你确定它没有那么多,请检查以下内容:

  1. 您是在某处构建此类的视图 - 在Interface Builder中还是在代码中?
  2. 您是否在正在显示的视图控制器的视图中添加此视图?
  3. 你给这个视图一个大小吗?新创建的视图可以使宽度和高度为零,使它们实际上不可见。
  4. 您的图片加载例程是否会返回任何内容?
  5. 其中一些可以使用日志记录进行测试。例如,要检查图像是否正确加载:

    UIImage *colorImage = [UIImage imageNamed:@"color.png"];
    UIImage *bwImage    = [UIImage imageNamed:@"transparent.png"];    
    
    // Check if the images loaded.
    NSLog(@"colorImage = %@", colorImage);
    if (!colorImage)
        NSLog(@"colorImage did not load, nothing to draw");
    
    NSLog(@"bwImage = %@", bwImage);
    if (!bwImage)
        NSLog(@"bwImage did not load, nothing to draw");
    

答案 1 :(得分:1)

您正在调用UIGraphicsEndImageContext(),但您从未调用UIGraphicsBeginImageContext(...),因此它可能会删除默认的绘图上下文(或同样疯狂的内容)。那条线不应该在那里;这些功能用于创建您自己的UIImage,您无需在此处执行此操作。