我想将r,g,b和两个CGImages的值相乘,以将单个图像用作遮罩(在其Alpha通道中)和色调(在rgb通道中)。我首先尝试过:
CGContextDrawImage(context, CGRectMake(0, 0, _w, _h), handle());
CGContextSetBlendMode(context, kCGBlendModeMultiply);
CGContextDrawImage(context, CGRectMake(0, 0, other->width(), other->height()), over);
然而,这只是色调,并没有掩盖。因此,我将掩蔽图像中的alpha提取为CGImage蒙版灰度图像(使用CGDataProvider)并将其用作上下文中的掩码:
// "mask" is "other"'s alpha channel as an inverted grayscale image
CGContextSaveGState(context);
CGContextClipToMask(context, CGRectMake(0, 0, other->width(), other->height()), mask);
CGImageRelease(mask);
CGContextDrawImage(context, CGRectMake(0, 0, _w, _h), handle());
CGContextRestoreGState(context); // Don't apply the clip mask to 'other', since it already has it
CGContextSetBlendMode(context, kCGBlendModeMultiply);
CGContextDrawImage(context, CGRectMake(0, 0, other->width(), other->height()), other->handle());
但是,它看起来仍然不合适。图像更亮;如果成倍增加的图像总是至少更暗?图片预览:
http://dl.dropbox.com/u/6775/multiply/index.html
提前感谢启示:)
答案 0 :(得分:2)
首先,您不需要将Alpha通道提取到单独的通道来进行屏蔽。你可以用kCGBlendModeDestinationIn
绘制它。对于倒置的面具,同样的事情,但kCGBlendModeDestinationOut
。
因此,解决方案是使用Multiply绘制第二个图像,然后使用Destination In或Out再次绘制它。