Objective c 在iOS中混合图像

Objective c 在iOS中混合图像,objective-c,ios,transparency,Objective C,Ios,Transparency,我有两个名为透明和彩色的图像,如上图所示。我想 先显示透明图像 当用户触摸屏幕时,在手指划动时显示彩色图像 这是我的drawRect代码 - (void) drawRect:(CGRect)rect { [[UIColor redColor] set]; CGContextRef context1 = UIGraphicsGetCurrentContext(); UIImage *colorImage = [UIImage imageNamed:@"color.png"]

我有两个名为透明和彩色的图像,如上图所示。我想

  • 先显示透明图像
  • 当用户触摸屏幕时,在手指划动时显示彩色图像
  • 这是我的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();    
    
    }


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

    您正在调用
    UIGraphicsEndImageContext()
    ,但您从未调用过
    UIGraphicsBeginImageContext(…)
    ,因此它可能正在删除默认的图形上下文(或类似疯狂的事情)。那条线不应该在那里;这些函数用于创建您自己的
    UIImage
    ,您在这里不需要这样做。

    在单个视图的
    drawRect
    方法中工作意味着每次用户绘制某个对象时,您都需要绘制两个图像和一个bezier路径。这将是相当低效的。您需要一种将图像和绘图区域存储在不同位置的方法

    CALayer很适合解决这类问题。可以将图像存储在图层中,并让用户的图形遮罩其中一个图层。首先从示例开始,包括示例

    对于真正平滑的绘图,您可以使用OpenGL,尽管这需要更多的工作才能正确绘制。看看苹果的例子


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

  • 您是否在某个地方构造此类的视图-在Interface Builder中还是在代码中
  • 是否将此视图添加到您知道正在显示的视图控制器的视图中
  • 你给这个视图定了尺寸吗?新创建的视图的宽度和高度可以为零,从而使它们实际上不可见
  • 您的图像加载例程是否返回任何内容
  • 其中一些可以通过日志记录进行测试。例如,要检查图像是否正确加载,请执行以下操作:

    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");
    

    我正在呼叫UIGraphicsGetCurrentContext。我的印象是drawRect已经创建了一个可供绘制的上下文。如果我错了,请纠正我。是的,当调用
    drawRect
    时,已经为您创建了一个上下文,并且该上下文在
    drawRect
    返回后关闭。它不是图像上下文,您不需要关闭它。您不需要任何东西来平衡
    UIGraphicsGetCurrentContext()
    。它只返回当前状态。它没有构造任何新的东西,因此没有什么可处理的。