我有2种颜色:1种动态设置,另一种总是白色0.5 alpha。我想要计算得到的白色,就像它是绘制在动态颜色之上使用叠加混合模式。
我知道覆盖结合了、Multiply和屏幕混合模式。
多重混合模式的公式是:
Result Color = (Top Color) * (Bottom Color) /255而屏幕混合模式是:
Result Color = 255 - [((255 - Top Color)*(255 - Bottom Color))/255]如何计算叠加混合模式的结果颜色?
是否有一个UIColor扩展类可以不加限制地执行此操作?
发布于 2011-04-28 21:27:36
公式分为两部分:
第一部分:如果下层值> 127.5,则执行以下操作-
值单位=(255-下层值)/127.5
最小值=下层值-(255-下层值)
叠加=(上层值*值单位)+最小值
第二部分:如果下层值< 127.5,则执行以下操作-
值Unit=Lower层值/127.5
叠加=上层值*值单位
从形式上可以看出,最终结果在很大程度上取决于上层值。如果上层值较高(较轻),则最终结果可能更轻。
来自这里。
发布于 2011-04-29 16:07:41
在威利的回答上,下面是移植到代码的公式:
CGFloat newComponents[4];
const CGFloat *topComponents = CGColorGetComponents([[UIColor colorWithRed:1 green:1 blue:1 alpha:1] CGColor]);
const CGFloat *components = CGColorGetComponents(self.color.CGColor);
const int n = CGColorGetNumberOfComponents(self.color.CGColor);
for(int i=0; i < n; i++) {
if(components[i] > 0.5) {
CGFloat value = (topComponents[i]-components[i])/0.5;
CGFloat min = components[i]-(topComponents[i]-components[i]);
newComponents[i] = topComponents[i]*value+min;
} else {
CGFloat value = components[i]/0.5;
newComponents[i] = topComponents[i]*value;
}
}
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
UIColor *resultColor = [UIColor colorWithCGColor:CGColorCreate(colorSpace, newComponents)];
CGColorSpaceRelease(colorSpace);发布于 2011-04-28 21:38:27
我不知道你的目标,可能是完全离题,但为什么不直接使用石英2D?
CGContextRef ctx = UIGraphicsGetCurrentContext();
CGContextSetBlendMode(ctx, kCGBlendModeOverlay);
... draw with overlay blendingCGBlendMode通过CGContextSetBlendMode覆盖,乘法,屏幕和更多.:
enum CGBlendMode {
/* Available in Mac OS X 10.4 & later. */
kCGBlendModeNormal,
kCGBlendModeMultiply,
kCGBlendModeScreen,
kCGBlendModeOverlay,
kCGBlendModeDarken,
kCGBlendModeLighten,
kCGBlendModeColorDodge,
kCGBlendModeColorBurn,
kCGBlendModeSoftLight,
kCGBlendModeHardLight,
kCGBlendModeDifference,
kCGBlendModeExclusion,
kCGBlendModeHue,
kCGBlendModeSaturation,
kCGBlendModeColor,
kCGBlendModeLuminosity,
/* Available in Mac OS X 10.5 & later. R, S, and D are, respectively,
premultiplied result, source, and destination colors with alpha; Ra,
Sa, and Da are the alpha components of these colors.
The Porter-Duff "source over" mode is called `kCGBlendModeNormal':
R = S + D*(1 - Sa)
Note that the Porter-Duff "XOR" mode is only titularly related to the
classical bitmap XOR operation (which is unsupported by
CoreGraphics). */
kCGBlendModeClear, /* R = 0 */
kCGBlendModeCopy, /* R = S */
kCGBlendModeSourceIn, /* R = S*Da */
kCGBlendModeSourceOut, /* R = S*(1 - Da) */
kCGBlendModeSourceAtop, /* R = S*Da + D*(1 - Sa) */
kCGBlendModeDestinationOver, /* R = S*(1 - Da) + D */
kCGBlendModeDestinationIn, /* R = D*Sa */
kCGBlendModeDestinationOut, /* R = D*(1 - Sa) */
kCGBlendModeDestinationAtop, /* R = S*(1 - Da) + D*Sa */
kCGBlendModeXOR, /* R = S*(1 - Da) + D*(1 - Sa) */
kCGBlendModePlusDarker, /* R = MAX(0, (1 - D) + (1 - S)) */
kCGBlendModePlusLighter /* R = MIN(1, S + D) */
};
typedef enum CGBlendMode CGBlendMode; /* Available in Mac OS X 10.4 & later. */https://stackoverflow.com/questions/5825149
复制相似问题