Применение изображения маски для стирания с помощью Win2D

Я хочу сделать прозрачной (стереть) определенную область изображения с помощью Win2D.

Для этой цели у меня есть маска, которая содержит прозрачный цвет (RRGGBBAA = xxxxxx00) для пикселей, которые нужно стереть, и белый цвет (RRGGBBAA = FFFFFFFF) для пикселей, которые должны остаться.

В идеале мне нужен либо CanvasBlend.And, либо CanvasBlend.Mutiply, но ни один из них не поставляется с Win2D. Однако есть CanvasBlend.Min, который, как я полагаю, тоже должен выполнять эту работу.

Вот код:

  internal static CanvasBitmap applyMask(
        ICanvasResourceCreatorWithDpi creator,
        CanvasBitmap sourceBmp, CanvasBitmap maskBmp,
        CanvasBlend blendMode = CanvasBlend.Min) {

        var destSize = sourceBmp.Size;
        var crt = new CanvasRenderTarget(creator, destSize);
        var rect = new Rect(new Point(), destSize);

        using (var ds = crt.CreateDrawingSession()) {
             ds.Blend = CanvasBlend.SourceOver;
             ds.DrawImage(sourceBmp, rect);
             ds.Blend = blendMode;
             ds.DrawImage(maskBmp, rect);
        }

        return crt;
  }

Он показывает исходное изображение полностью неизмененным, как будто непрозрачность маскированного изображения (альфа) игнорируется. Какие-либо предложения?


person cyanide    schedule 03.01.2017    source источник


Ответы (1)


Взгляните на недавно добавленный AlphaMaskEffect: https://microsoft.github.io/Win2D/html/T_Microsoft_Graphics_Canvas_Effects_AlphaMaskEffect.htm

person Shawn Hargreaves    schedule 04.01.2017
comment
Да, эффект альфа-маски — это то, что действительно нужно, но он работает только с Windows 10 Aniversary, а мое приложение поддерживает Windows 8.1+. На данный момент я делаю это вручную через WriteableBitmap. Я отмечаю это как ответ, учитывая, что ничего другого нет. - person cyanide; 18.04.2017