8

私は2つの色を持っています:1つは動的に設定され、もう1つは常に白0.5アルファです。オーバーレイブレンドモードを使用して、ダイナミックカラーの上に描画されたかのように結果の白色を計算したいと思います。

オーバーレイが乗算モードと画面ブレンドモードを組み合わせていることを知っています。

乗算ブレンドモードの式は次のとおりです。

Result Color = (Top Color) * (Bottom Color) /255

スクリーンブレンドモードは次のとおりです。

Result Color = 255 - [((255 - Top Color)*(255 - Bottom Color))/255]

オーバーレイブレンドモードの結果の色を計算するにはどうすればよいですか?

UIColor箱から出してこれを行う拡張クラスはありますか?

4

3 に答える 3

8

式には2つの部分があります。

最初の部分:下位層の値> 127.5の場合、次のようにします-

値の単位=(255-下位レイヤー値)/127.5

最小値=下位レイヤー値-(255-下位レイヤー値)

オーバーレイ=(上位レイヤー値*値の単位)+最小値

2番目の部分:下位層の値が127.5未満の場合は、次のようにします-

値の単位=下位レイヤーの値/127.5

オーバーレイ=上位層の値*値の単位

公式から、最終結果は上位層の値に大きく依存していることがわかります。上層の値が高い(明るい)場合、最終結果はより明るい可能性が高くなります。

ここから。

于 2011-04-28T21:27:36.373 に答える
8

williの回答に続いて、コードに移植された式は次のとおりです。

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-29T16:07:41.720 に答える
2

私はあなたの目標がわからず、完全に話題から外れているかもしれませんが、Quartz 2Dを使用しないのはなぜですか?

CGContextRef ctx = UIGraphicsGetCurrentContext();
CGContextSetBlendMode(ctx, kCGBlendModeOverlay);
... draw with overlay blending

CGBlendModeオーバーレイ、乗算、スクリーンなどを介したオファー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. */
于 2011-04-28T21:38:27.640 に答える