Как составить два изображения (используя источник в композиции)? - PullRequest
0 голосов
/ 18 октября 2018

Мне нужно выполнить Источник В композиции на 2 изображениях.

Например, это изображение:
Source
и изображение маски(протестировано с черно-прозрачным и черно-белым):
mask

должен дать результат:
result image

Я пытаюсь сделать это с ImageSharp :

img.Mutate(imgMaskIn =>
{
    using (var mask = Image.Load(maskImageFileName))
    {
        imgMaskIn.DrawImage(mask, new GraphicsOptions { AlphaCompositionMode = PixelAlphaCompositionMode.SrcIn});
    }
});

, но в результате получается изображение маски.Он должен работать на основе этого запроса на слияние .
Я неправильно использовал библиотеку или есть ошибка?

Есть ли другой способ сделать это в ASP.NET Core?

1 Ответ

0 голосов
/ 18 октября 2018

К сожалению, синтаксис для этого с ImageSharp меняется между текущей предварительной версией и версией разработки, которая должна быть окончательным API для этого.

С 1.0.0-beta0005 , вы можете смешать эти изображения следующим образом:

using (var pattern = Image.Load("img_pattern.png"))
using (var texture = Image.Load("img_texture.png"))
{
    var options = new GraphicsOptions { BlenderMode = PixelBlenderMode.In };
    using (var result = pattern.Clone(x => x.DrawImage(options, texture)))
    {
        result.Save("img_out.png");
    }
}

Обратите внимание, что для этого вы должны использовать изображение шаблона с альфа-прозрачностью.Вы не можете использовать прозрачность с помощью клавиш (по крайней мере, с этим решением).

Я сделал шаблон прозрачным для этой цели (вы можете получить тот, который я использовал здесь ) и получил эторезультат:

Result image


В финальной версии это будет выглядеть так:

using (var pattern = Image.Load("img_pattern.png"))
using (var texture = Image.Load("img_texture.png"))
{
    var options = new GraphicsOptions { AlphaCompositionMode = PixelAlphaCompositionMode.SrcIn };
    using (var result = pattern.Clone(x => x.DrawImage(texture, options)))
    {
        result.Save("img_out.png");
    }
}

Хороший способ понять это, кстати.это посмотреть на PorterDuffCompositorTests файл , который содержит тесты для этой функции и поэтому всегда будет отражать текущий API.

...