将RGBA与两个CGImageRef相乘

时间:2010-09-16 09:38:34

标签: core-graphics cgcontext cgimage masking

我想将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

提前感谢启示:)

1 个答案:

答案 0 :(得分:2)

首先,您不需要将Alpha通道提取到单独的通道来进行屏蔽。你可以用kCGBlendModeDestinationIn绘制它。对于倒置的面具,同样的事情,但kCGBlendModeDestinationOut

因此,解决方案是使用Multiply绘制第二个图像,然后使用Destination In或Out再次绘制它。