분리 가능한 blend 모드The separable blend modes

샘플 다운로드 샘플 다운로드Download Sample Download the sample

이 문서에서 볼 수 있듯이 SkiaSharp Porter 임신 blend 모드, Porter 임신 blend 모드는 일반적으로 클리핑 작업을 수행 합니다.As you saw in the article SkiaSharp Porter-Duff blend modes, the Porter-Duff blend modes generally perform clipping operations. 분리 가능한 blend 모드는 다릅니다.The separable blend modes are different. 분리 가능한 모드는 이미지의 개별 빨강, 녹색 및 파랑 색 구성 요소를 변경합니다.The separable modes alter the individual red, green, and blue color components of an image. 분리 가능한 blend 모드 색의 빨강, 녹색 및 파랑 조합 흰색인 실제로 보여 주기 위해 혼합할 수 있습니다.Separable blend modes can mix color to demonstrate that the combination of red, green, and blue is indeed white:

기본 색Primary Colors

두 가지 방법으로 어둡게 및 밝게Lighten and darken two ways

일반적으로 어느 정도 비트맵이 너무 어둡게 또는 밝게 너무 합니다.It is common to have a bitmap that is somewhat too dark or too light. imabe 어둡게 또는 밝게 분리 가능한 blend 모드를 사용할 수 있습니다.You can use separable blend modes to lighten or darken the imabe. 분리 가능 혼합 모드의 두 실제로 SKBlendMode 열거형 라고 LightenDarken합니다.Indeed, two of the separable blend modes in the SKBlendMode enumeration are named Lighten and Darken.

이러한 두 가지 모드에서 보여 합니다 어둡게 및 밝게 페이지입니다.These two modes are demonstrated in the Lighten and Darken page. XAML 파일을 두 개를 인스턴스화하고 SKCanvasView 개체와 두 개의 Slider 뷰:The XAML file instantiates two SKCanvasView objects and two Slider views:

<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:skia="clr-namespace:SkiaSharp.Views.Forms;assembly=SkiaSharp.Views.Forms"
             x:Class="SkiaSharpFormsDemos.Effects.LightenAndDarkenPage"
             Title="Lighten and Darken">
    <StackLayout>
        <skia:SKCanvasView x:Name="lightenCanvasView"
                           VerticalOptions="FillAndExpand"
                           PaintSurface="OnCanvasViewPaintSurface" />

        <Slider x:Name="lightenSlider"
                Margin="10"
                ValueChanged="OnSliderValueChanged" />

        <skia:SKCanvasView x:Name="darkenCanvasView"
                           VerticalOptions="FillAndExpand"
                           PaintSurface="OnCanvasViewPaintSurface" />

        <Slider x:Name="darkenSlider"
                Margin="10"
                ValueChanged="OnSliderValueChanged" />
    </StackLayout>
</ContentPage>

첫 번째 SKCanvasView 하 고 Slider 시연 SKBlendMode.Lighten 하 고 두 번째 쌍은 보여 줍니다 SKBlendMode.Darken합니다.The first SKCanvasView and Slider demonstrate SKBlendMode.Lighten and the second pair demonstrates SKBlendMode.Darken. 두 개의 Slider 뷰는 동일한 공유 ValueChanged 처리기 및 두 개의 SKCanvasView 동일한 공유 PaintSurface 처리기입니다.The two Slider views share the same ValueChanged handler, and the two SKCanvasView share the same PaintSurface handler. 개체는 모두 이벤트 처리기 검사 이벤트를 발생 합니다.Both event handlers check which object is firing the event:

public partial class LightenAndDarkenPage : ContentPage
{
    SKBitmap bitmap = BitmapExtensions.LoadBitmapResource(
                typeof(SeparableBlendModesPage),
                "SkiaSharpFormsDemos.Media.Banana.jpg");

    public LightenAndDarkenPage ()
    {
        InitializeComponent ();
    }

    void OnSliderValueChanged(object sender, ValueChangedEventArgs args)
    {
        if ((Slider)sender == lightenSlider)
        {
            lightenCanvasView.InvalidateSurface();
        }
        else
        {
            darkenCanvasView.InvalidateSurface();
        }
    }

    void OnCanvasViewPaintSurface(object sender, SKPaintSurfaceEventArgs args)
    {
        SKImageInfo info = args.Info;
        SKSurface surface = args.Surface;
        SKCanvas canvas = surface.Canvas;

        canvas.Clear();

        // Find largest size rectangle in canvas
        float scale = Math.Min((float)info.Width / bitmap.Width,
                               (float)info.Height / bitmap.Height);
        SKRect rect = SKRect.Create(scale * bitmap.Width, scale * bitmap.Height);
        float x = (info.Width - rect.Width) / 2;
        float y = (info.Height - rect.Height) / 2;
        rect.Offset(x, y);

        // Display bitmap
        canvas.DrawBitmap(bitmap, rect);

        // Display gray rectangle with blend mode
        using (SKPaint paint = new SKPaint())
        {
            if ((SKCanvasView)sender == lightenCanvasView)
            {
                byte value = (byte)(255 * lightenSlider.Value);
                paint.Color = new SKColor(value, value, value);
                paint.BlendMode = SKBlendMode.Lighten;
            }
            else
            {
                byte value = (byte)(255 * (1 - darkenSlider.Value));
                paint.Color = new SKColor(value, value, value);
                paint.BlendMode = SKBlendMode.Darken;
            }

            canvas.DrawRect(rect, paint);
        }
    }
}

PaintSurface 처리기 비트맵에 대 한 적합 한 사각형을 계산 합니다.The PaintSurface handler calculates a rectangle suitable for the bitmap. 해당 비트맵을 표시 하 고 다음 사용 하 여 비트맵 사각형을 표시 하는 처리기를 SKPaint 개체를 해당 BlendMode 속성으로 설정 SKBlendMode.Lighten 또는 SKBlendMode.Darken합니다.The handler displays that bitmap and then displays a rectangle over the bitmap using an SKPaint object with its BlendMode property set to SKBlendMode.Lighten or SKBlendMode.Darken. 합니다 Color 속성을 기반으로 하는 회색 음영을 Slider합니다.The Color property is a gray shade based on the Slider. 에 대 한 합니다 Lighten 모드, 색 범위가 검정에서을 흰색으로 대해서는 Darken 흰색에서 검은색 범위의 모드입니다.For the Lighten mode, the color ranges from black to white, but for the Darken mode it ranges from white to black.

왼쪽에서 오른쪽 스크린샷을 표시 점점 더 큰 Slider 위쪽 이미지 밝은 가져오고 아래쪽 이미지 가져옵니다 음영이 짙을 수록 값:The screenshots from left to right show increasingly larger Slider values as the top image gets lighter and the bottom image gets darker:

어둡게 및 밝게Lighten and Darken

이 프로그램을 분리 가능한 blend 모드를 사용 하는 일반적인 방법으로 보여 줍니다. 대상은 자주 비트맵 일종의 이미지입니다.This program demonstrates the normal way in which the separable blend modes are used: The destination is an image of some sort, very often a bitmap. 원본이 사용 하 여 표시 사각형을 SKPaint 개체를 해당 BlendMode 분리 가능한 blend 모드를 설정 하는 속성입니다.The source is a rectangle displayed using an SKPaint object with its BlendMode property set to a separable blend mode. 사각형 (이므로 여기) 단색 수 또는 그라데이션 합니다.The rectangle can be a solid color (as it is here) or a gradient. 투명도 되지 분리 가능한 blend 모드를 사용 하 여 일반적으로 사용 됩니다.Transparency is not generally used with the separable blend modes.

이 프로그램을 사용 하 여 실험 시에 이러한 두 혼합 모드 밝게 및 이미지를 균일 하 게 어둡게 하지 않는 알 수 있습니다.As you experiment with this program, you'll discover that these two blend modes do not lighten and darken the image uniformly. 대신는 Slider 일종의 임계값을 설정 하는 것 같습니다.Instead, the Slider seems to set a threshold of some sort. 예를 들어을 늘리면 합니다 Slider 에 대 한는 Lighten 모드 이미지의 어두운 영역 가져오기 light 먼저 밝은 영역을 동일 하 게 유지 하는 동안.For example, as you increase the Slider for the Lighten mode, the darker areas of the image get light first while the lighter areas remain the same.

에 대 한는 Lighten 모드 대상 픽셀 (Dr Dg, Db)의 RGB 색 값 이며 원본 픽셀 색 (Sr Sg, Sb), 출력은 다음 (또는 Og, Ob) 다음과 같이 계산 합니다.For the Lighten mode, if the destination pixel is the RGB color value (Dr, Dg, Db), and the source pixel is the color (Sr, Sg, Sb), then the output is (Or, Og, Ob) calculated as follows:

Or = max(Dr, Sr) Og = max(Dg, Sg)Or = max(Dr, Sr) Og = max(Dg, Sg) Ob = max(Db, Sb)

이와 별도로, 빨강, 녹색 및 파랑에 대 한 결과 원본과 대상의 큽니다.For red, green, and blue separately, the result is the greater of the destination and source. 이 대상의 어두운 영역을 먼저 밝게의 효과 생성 합니다.This produces the effect of lightening the dark areas of the destination first.

Darken 모드는 비슷한 점을 제외 하 고 결과 원본과 대상의 가장 작은 수입니다.The Darken mode is similar except that the result is the lesser of the destination and source:

Or = min(Dr, Sr) Og = min(Dg, Sg)Or = min(Dr, Sr) Og = min(Dg, Sg) Ob = min(Db, Sb)

빨강, 녹색 및 파랑 구성 요소는 각각 별도로 처리는 이러한 모드를 혼합 하는 이유는 라고 합니다 분리 가능한 혼합 모드입니다.The red, green, and blue components are each handled separately, which is why these blend modes are referred to as the separable blend modes. 이러한 이유로 약어 Dc 하 고 Sc 대상 및 소스 색을 사용할 수 있으며 계산 각 빨강, 녹색 및 파랑 구성 요소를 개별적으로 적용할 것으로 간주 됩니다.For this reason, the abbreviations Dc and Sc can be used for the destination and source colors, and it's understood that calculations apply to each of the red, green, and blue components separately.

다음 표에서 수행할 작업의 간략 한 설명 사용 하 여 모든 분리 가능한 blend 모드를 보여 줍니다.The following table shows all the separable blend modes with brief explanations of what they do. 두 번째 열 변하지를 생성 하는 소스 색을 표시 합니다.The second column shows the source color that produces no change:

혼합 모드Blend Mode 변경 안 함No change 작업Operation
Plus 검정Black 색을 추가 하 여: Sc + DcLightens by adding colors: Sc + Dc
Modulate 하얀White 색을 곱하여 어두워집니다. Sc·DcDarkens by multiplying colors: Sc·Dc
Screen 검정Black 보완 제품을 보완 합니다. Sc + Dc – Sc·DcComplements product of complements: Sc + Dc – Sc·Dc
Overlay 회색Gray HardLightInverse of HardLight
Darken 하얀White 최소 색: min (Sc, Dc)Minimum of colors: min(Sc, Dc)
Lighten 검정Black 색의 최대: max (Sc, Dc)Maximum of colors: max(Sc, Dc)
ColorDodge 검정Black 원본에 따라 대상 어둡게Brightens destination based on source
ColorBurn 하얀White 원본에 따라 대상 어둡게Darkens destination based on source
HardLight 회색Gray 강한 집중 미치는 비슷합니다Similar to effect of harsh spotlight
SoftLight 회색Gray 소프트 추천의 결과 비슷하게Similar to effect of soft spotlight
Difference 검정Black 음영이 짙을 수록 더 밝은에서 뺍니다. Abs(Dc – Sc)Subtracts the darker from the lighter: Abs(Dc – Sc)
Exclusion 검정Black 유사한 Difference 하지만 낮은 대비Similar to Difference but lower contrast
Multiply 하얀White 색을 곱하여 어두워집니다. Sc·DcDarkens by multiplying colors: Sc·Dc

W3C에서 자세한 알고리즘을 찾을 수 있습니다 합성 하 고 수준 1 혼합 사양과 Skia SkBlendMode 참조 이지만 이러한 두 원본의 표기법 같지 않습니다.More detailed algorithms can be found in the W3C Compositing and Blending Level 1 specification and the Skia SkBlendMode Reference, although the notation in these two sources is not the same. 에 유의 Plus Porter 임신 blend 모드로, 일반적으로 간주 됩니다 및 Modulate W3C 사양과의 일부가 아닙니다.Keep in mind that Plus is commonly regarded as a Porter-Duff blend mode, and Modulate is not part of the W3C specification.

원본 투명 인 경우 다음 모든 분리에 대 한 혼합 모드 제외 하 고 Modulate, 혼합 모드에 영향을 주지 않습니다.If the source is transparent, then for all the separable blend modes except Modulate, the blend mode has no effect. 앞에서 살펴본 것 처럼는 Modulate blend 모드 곱하기의 알파 채널을 통합 합니다.As you've seen earlier, the Modulate blend mode incorporates the alpha channel in the multiplication. 그렇지 않으면 Modulate 것과 동일한 효과가 Multiply합니다.Otherwise, Modulate has the same effect as Multiply.

라는 두 가지 모드를 알 수 있습니다 ColorDodgeColorBurn입니다.Notice the two modes named ColorDodge and ColorBurn. 단어 닷지 하 고 굽기 photographic 암실 사례에서 발생 합니다.The words dodge and burn originated in photographic darkroom practices. 확대기 빛을 비추는 것과 음수를 통해 사진 인쇄를 수 있습니다.An enlarger makes a photographic print by shining light through a negative. 없는 light를 사용 하 여 인쇄는 흰색입니다.With no light, the print is white. 인쇄는 음영이 짙을 수록 더 긴 기간에 대 한 인쇄에 자세한 light 떨어지면 가져옵니다.The print gets darker as more light falls on the print for a longer period of time. 인쇄 결정권자는 늦는 해당 영역 밝은 print의 특정 부분에서 빛의 일부를 차단 하는 직접 또는 작은 개체 경우가 많습니다.Print-makers often used a hand or small object to block some of the light from falling on a certain part of the print, making that area lighter. 이 이라고 _닷지_합니다.This is known as dodging. 직접 어두워집니다 라는 특정 위치에 자세한 조명 하 고 (또는 광원의 대부분을 차단 하는 실습)에 구멍이 있는 불투명 자료를 사용할 수 있습니다 반대로 _굽기_합니다.Conversely, opaque material with a hole in it (or hands blocking most of the light) could be used to direct more light in a particular spot to darken it, called burning.

합니다 닷지 및 Burn 프로그램은 매우 비슷합니다 어둡게 및 밝게합니다.The Dodge and Burn program is very similar to Lighten and Darken. XAML 파일이 동일 하지만 다른 요소 이름의 구조적 및 마찬가지로 코드 숨김 파일이 상당히 유사 하지만 이러한 두 혼합 모드의 효과 상당히 다릅니다.The XAML file is structured the same but with different element names, and the code-behind file is likewise quite similar, but the effect of these two blend modes is quite different:

Burn 및 닷지Dodge and Burn

소규모 Slider 값을 Lighten 모드의 어두운 영역 하는 동안 먼저 ColorDodge 더 균일 하 게 밝게.For small Slider values, the Lighten mode lightens dark areas first, while ColorDodge lightens more uniformly.

이미지 처리 응용 프로그램에는 종종 닷지 및 마찬가지로 한 암실 특정 영역으로 제한 됩니다 수 있습니다.Image-processing application programs often allow dodging and burning to be restricted to specific areas, just like in a darkroom. 그라데이션 또는 다양 한 회색 음영을 사용 하 여 비트맵에서 수행할 수 있습니다.This can be accomplished by gradients, or by a bitmap with varying shades of gray.

분리 가능한 blend 모드를 탐색합니다.Exploring the separable blend modes

합니다 분리 가능한 Blend 모드 페이지를 사용 하면 모든 분리 가능한 blend 모드를 검사할 수 있습니다.The Separable Blend Modes page allows you to examine all the separable blend modes. 비트맵 대상과 blend 모드 중 하나를 사용 하 여 색이 칠해진된 사각형 원본을 표시 합니다.It displays a bitmap destination and a colored rectangle source using one of the blend modes.

XAML 파일은 정의 Picker (blend 모드를 선택)를와 네 개의 슬라이더입니다.The XAML file defines a Picker (to select the blend mode) and four sliders. 처음 세 개의 슬라이더 원본의 빨강, 녹색 및 파랑 구성 요소를 설정할 수 있습니다.The first three sliders let you set the red, green, and blue components of the source. 네 번째 슬라이더는 회색 음영을 설정 하 여 해당 값을 재정의 하는 데 사용 됩니다.The fourth slider is intended to override those values by setting a gray shade. 개별 슬라이더 식별 되지 않습니다 하지만 색 해당 함수를 나타냅니다.The individual sliders are not identified, but colors indicate their function:

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:skia="clr-namespace:SkiaSharp;assembly=SkiaSharp"
             xmlns:skiaviews="clr-namespace:SkiaSharp.Views.Forms;assembly=SkiaSharp.Views.Forms"
             x:Class="SkiaSharpFormsDemos.Effects.SeparableBlendModesPage"
             Title="Separable Blend Modes">

    <StackLayout>
        <skiaviews:SKCanvasView x:Name="canvasView"
                                VerticalOptions="FillAndExpand"
                                PaintSurface="OnCanvasViewPaintSurface" />

        <Picker x:Name="blendModePicker"
                Title="Blend Mode"
                Margin="10, 0"
                SelectedIndexChanged="OnPickerSelectedIndexChanged">
            <Picker.ItemsSource>
                <x:Array Type="{x:Type skia:SKBlendMode}">
                    <x:Static Member="skia:SKBlendMode.Plus" />
                    <x:Static Member="skia:SKBlendMode.Modulate" />
                    <x:Static Member="skia:SKBlendMode.Screen" />
                    <x:Static Member="skia:SKBlendMode.Overlay" />
                    <x:Static Member="skia:SKBlendMode.Darken" />
                    <x:Static Member="skia:SKBlendMode.Lighten" />
                    <x:Static Member="skia:SKBlendMode.ColorDodge" />
                    <x:Static Member="skia:SKBlendMode.ColorBurn" />
                    <x:Static Member="skia:SKBlendMode.HardLight" />
                    <x:Static Member="skia:SKBlendMode.SoftLight" />
                    <x:Static Member="skia:SKBlendMode.Difference" />
                    <x:Static Member="skia:SKBlendMode.Exclusion" />
                    <x:Static Member="skia:SKBlendMode.Multiply" />
                </x:Array>
            </Picker.ItemsSource>

            <Picker.SelectedIndex>
                0
            </Picker.SelectedIndex>
        </Picker>

        <Slider x:Name="redSlider"
                MinimumTrackColor="Red"
                MaximumTrackColor="Red"
                Margin="10, 0"
                ValueChanged="OnSliderValueChanged" />

        <Slider x:Name="greenSlider"
                MinimumTrackColor="Green"
                MaximumTrackColor="Green"
                Margin="10, 0"
                ValueChanged="OnSliderValueChanged" />

        <Slider x:Name="blueSlider"
                MinimumTrackColor="Blue"
                MaximumTrackColor="Blue"
                Margin="10, 0"
                ValueChanged="OnSliderValueChanged" />

        <Slider x:Name="graySlider"
                MinimumTrackColor="Gray"
                MaximumTrackColor="Gray"
                Margin="10, 0"
                ValueChanged="OnSliderValueChanged" />

        <Label x:Name="colorLabel"
               HorizontalTextAlignment="Center" />

    </StackLayout>
</ContentPage>

코드 숨김 파일 비트맵 리소스 중 하나를 로드 하 고 캔버스의 위쪽 절반에서 한 번에 다시 아래쪽을 두 번 그립니다 캔버스의 절반.The code-behind file loads one of the bitmap resources and draws it twice, once in the top half of the canvas and again in the bottom half of the canvas:

public partial class SeparableBlendModesPage : ContentPage
{
    SKBitmap bitmap = BitmapExtensions.LoadBitmapResource(
                        typeof(SeparableBlendModesPage),
                        "SkiaSharpFormsDemos.Media.Banana.jpg"); 

    public SeparableBlendModesPage()
    {
        InitializeComponent();
    }

    void OnPickerSelectedIndexChanged(object sender, EventArgs args)
    {
        canvasView.InvalidateSurface();
    }

    void OnSliderValueChanged(object sender, ValueChangedEventArgs e)
    {
        if (sender == graySlider)
        {
            redSlider.Value = greenSlider.Value = blueSlider.Value = graySlider.Value;
        }

        colorLabel.Text = String.Format("Color = {0:X2} {1:X2} {2:X2}",
                                        (byte)(255 * redSlider.Value),
                                        (byte)(255 * greenSlider.Value),
                                        (byte)(255 * blueSlider.Value));

        canvasView.InvalidateSurface();
    }

    void OnCanvasViewPaintSurface(object sender, SKPaintSurfaceEventArgs args)
    {
        SKImageInfo info = args.Info;
        SKSurface surface = args.Surface;
        SKCanvas canvas = surface.Canvas;

        canvas.Clear();

        // Draw bitmap in top half
        SKRect rect = new SKRect(0, 0, info.Width, info.Height / 2);
        canvas.DrawBitmap(bitmap, rect, BitmapStretch.Uniform);

        // Draw bitmap in bottom halr
        rect = new SKRect(0, info.Height / 2, info.Width, info.Height);
        canvas.DrawBitmap(bitmap, rect, BitmapStretch.Uniform);

        // Get values from XAML controls
        SKBlendMode blendMode =
            (SKBlendMode)(blendModePicker.SelectedIndex == -1 ?
                                        0 : blendModePicker.SelectedItem);

        SKColor color = new SKColor((byte)(255 * redSlider.Value),
                                    (byte)(255 * greenSlider.Value),
                                    (byte)(255 * blueSlider.Value));

        // Draw rectangle with blend mode in bottom half
        using (SKPaint paint = new SKPaint())
        {
            paint.Color = color;
            paint.BlendMode = blendMode;
            canvas.DrawRect(rect, paint);
        }
    }
}

아래쪽에는 PaintSurface 처리기를 사각형 선택한 blend 모드 및 선택한 색을 사용 하 여 두 번째 비트맵 위에 그려집니다.Towards the bottom of the PaintSurface handler, a rectangle is drawn over the second bitmap with the selected blend mode and the selected color. 맨 위에 있는 원래 비트맵을 사용 하 여 맨 아래에서 수정 된 비트맵을 비교할 수 있습니다.You can compare the modified bitmap at the bottom with the original bitmap at the top:

분리 가능한 Blend 모드Separable Blend Modes

가산 및 무언가 감 기본 색Additive and subtractive primary colors

합니다 기본 색 페이지는 빨강, 녹색 및 파랑의 세 가지 겹치는 원을 그립니다.The Primary Colors page draws three overlapping circles of red, green, and blue:

기본 색 가산적Additive Primary Colors

가산적 기본 색입니다.These are the additive primary colors. 녹청, 자홍, 노랑, 두 조합을 생성 하 고 세 가지의 조합은 흰색입니다.Combinations of any two produce cyan, magenta, and yellow, and a combination of all three is white.

사용 하 여 이러한 세 개의 원으로 그려집니다 합니다 SKBlendMode.Plus 있지만 모드를 사용할 수도 있습니다 ScreenLighten, 또는 Difference 같은 효과 대 한 합니다.These three circles are drawn with the SKBlendMode.Plus mode, but you can also use Screen, Lighten, or Difference for the same effect. 프로그램은 다음과 같습니다.Here's the program:

public class PrimaryColorsPage : ContentPage
{
    bool isSubtractive;

    public PrimaryColorsPage ()
    {
        Title = "Primary Colors";

        SKCanvasView canvasView = new SKCanvasView();
        canvasView.PaintSurface += OnCanvasViewPaintSurface;

        // Switch between additive and subtractive primaries at tap
        TapGestureRecognizer tap = new TapGestureRecognizer();
        tap.Tapped += (sender, args) =>
        {
            isSubtractive ^= true;
            canvasView.InvalidateSurface();
        };
        canvasView.GestureRecognizers.Add(tap);

        Content = canvasView;
    }

    void OnCanvasViewPaintSurface(object sender, SKPaintSurfaceEventArgs args)
    {
        SKImageInfo info = args.Info;
        SKSurface surface = args.Surface;
        SKCanvas canvas = surface.Canvas;

        canvas.Clear();

        SKPoint center = new SKPoint(info.Rect.MidX, info.Rect.MidY);
        float radius = Math.Min(info.Width, info.Height) / 4;
        float distance = 0.8f * radius;     // from canvas center to circle center
        SKPoint center1 = center + 
            new SKPoint(distance * (float)Math.Cos(9 * Math.PI / 6),
                        distance * (float)Math.Sin(9 * Math.PI / 6));
        SKPoint center2 = center +
            new SKPoint(distance * (float)Math.Cos(1 * Math.PI / 6),
                        distance * (float)Math.Sin(1 * Math.PI / 6));
        SKPoint center3 = center +
            new SKPoint(distance * (float)Math.Cos(5 * Math.PI / 6),
                        distance * (float)Math.Sin(5 * Math.PI / 6));

        using (SKPaint paint = new SKPaint())
        {
            if (!isSubtractive)
            {
                paint.BlendMode = SKBlendMode.Plus; 
                System.Diagnostics.Debug.WriteLine(paint.BlendMode);

                paint.Color = SKColors.Red;
                canvas.DrawCircle(center1, radius, paint);

                paint.Color = SKColors.Lime;    // == (00, FF, 00)
                canvas.DrawCircle(center2, radius, paint);

                paint.Color = SKColors.Blue;
                canvas.DrawCircle(center3, radius, paint);
            }
            else
            {
                paint.BlendMode = SKBlendMode.Multiply
                System.Diagnostics.Debug.WriteLine(paint.BlendMode);

                paint.Color = SKColors.Cyan;
                canvas.DrawCircle(center1, radius, paint);

                paint.Color = SKColors.Magenta;
                canvas.DrawCircle(center2, radius, paint);

                paint.Color = SKColors.Yellow;
                canvas.DrawCircle(center3, radius, paint);
            }
        }
    }
}

포함 하는 프로그램을 TabGestureRecognizer입니다.The program includes a TabGestureRecognizer. 프로그램에 사용 하 여 화면을 누르거나 탭 하는 경우 SKBlendMode.Multiply 무언가 감 세 원색을 표시 하려면:When you tap or click the screen, the program uses SKBlendMode.Multiply to display the three subtractive primaries:

기본 색 무언가 감Subtractive Primary Colors

Darken 모드 이와 같은 효과 대해서도 작동 합니다.The Darken mode also works for this same effect.