Как составить два изображения (используя источник в композиции)?
Мне нужно выполнить Source In композиции на 2 изображения.
Например это изображение:
и изображение маски (протестировано с черно-прозрачным и черно-белым):
Я пытаюсь сделать это с ImageSharp:
img.Mutate(imgMaskIn =>
{
using (var mask = Image.Load(maskImageFileName))
{
imgMaskIn.DrawImage(mask, new GraphicsOptions { AlphaCompositionMode = PixelAlphaCompositionMode.SrcIn});
}
});
но результат - изображение маски. Он должен работать на основе этого запроса на слияние.
Я неправильно использовал библиотеку, или есть ошибка?
Есть ли другой способ сделать это в ASP.NET Core?
2 ответа
К сожалению, синтаксис для этого с 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");
}
}
Обратите внимание, что для этого вы должны использовать изображение шаблона с альфа-прозрачностью. Вы не можете использовать прозрачность с ключом (по крайней мере, с этим решением).
Я сделал шаблон прозрачным для этой цели (вы можете получить тот, который я использовал здесь) и получил такой результат:
В финальной версии это будет выглядеть так:
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.
По состоянию на март 2022 года принятый ответ больше не работает с ImageSharp 2. Следующий код не решает точную проблему в вопросе, но именно так я получил что-то похожее на работу:
using SixLabors.ImageSharp;
using SixLabors.ImageSharp.PixelFormats;
using SixLabors.ImageSharp.Processing.Processors.Drawing;
...
using (var inImg = Image.Load<RgbaVector>(imagePath)) //has some transparent pixels
using (var background = new Image<RgbaVector>(inImg.Width, inImg.Height, new RgbaVector(1, 0, 0, 1))) //this is just a solid red image of the same size as the loaded image, but it could be any image
{
var processorCreator = new DrawImageProcessor(
inImg,
Point.Empty,
PixelColorBlendingMode.Normal,
PixelAlphaCompositionMode.SrcAtop, //this is the setting you want to play with to get the behavior from the original question
1f
);
var pxProcessor = processorCreator.CreatePixelSpecificProcessor(
Configuration.Default,
background,
inImg.Bounds());
pxProcessor.Execute(); //writes to the image passed into CreatePixelSpecificProcessor, in this case background
background.Save("some_path.png");
}
}