【问题标题】:Blending Images in iOS在 iOS 中混合图像
【发布时间】:2012-04-15 04:40:45
【问题描述】:

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

  1. 首先显示透明图像
  2. 当用户触摸屏幕时,在手指划动时显示彩色图像。

这是我的 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();    

}

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

【问题讨论】:

    标签: objective-c ios transparency


    【解决方案1】:

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

    CALayer 可以很好地解决这类问题。您可以将图像存储在图层中,并让用户的绘图蒙版其中一个图层。从CALayer Class Reference 开始,包括示例。

    对于真正流畅的绘图,您需要使用 OpenGL - 尽管需要做更多的工作才能做到正确。请参阅 Apple 的 GLPaint 示例。


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

    1. 您是否在某处构建此类的视图 - 无论是在 Interface Builder 中还是在代码中?
    2. 您是否将此视图添加到您知道正在显示的视图控制器的视图中?
    3. 你是否给这个视图一个尺寸?新创建的视图的宽度和高度可以为零,从而使它们实际上是不可见的。
    4. 您的图像加载例程是否返回任何内容?

    其中一些可以通过日志记录进行测试。例如,检查图像是否正确加载:

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 我正在调用 UIGraphicsGetCurrentContext。我的印象是 drawRect 已经创建了一个要绘制的上下文。如果我错了,请纠正我。
      • 是的,当drawRect 被调用时,已经为您创建了一个上下文,并且在drawRect 返回后该上下文被关闭。它不是图像上下文,您不需要关闭它。你不需要任何东西来平衡UIGraphicsGetCurrentContext()。它只是返回当前状态。它没有构建任何新的东西,所以没有什么需要处理的。
      猜你喜欢
      • 1970-01-01
      • 2012-07-15
      • 2016-01-23
      • 2012-06-02
      • 1970-01-01
      • 2015-05-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多