Существуют различные методы для этого:
пиксельные сканирования данных и построить изображение маски (как уже было предложено itsme86 и Моби Disk)
Вариант сканирования, который создает область отсечения из маски и использует это при рисовании (см. this article
от Bob Powell)
Используйте цветные клавиши для маскировки в вызове Graphics.DrawImage
.
Я остановлюсь на третьем варианте.
Предполагая, что цветное изображение, которые вы хотите исключить из вашей маски Color.Lime
, мы можем использовать ImageAttributes.SetColorKey
, чтобы остановить любого из этого цвета от втягивания во время разговора Graphics.DrawImage
так:
using (Image background = Bitmap.FromFile("tree.png"))
using (Image masksource = Bitmap.FromFile("mask.png"))
using (var imgattr = new ImageAttributes())
{
// set color key to Lime
imgattr.SetColorKey(Color.Lime, Color.Lime);
// Draw non-lime portions of mask onto original
using (var g = Graphics.FromImage(background))
{
g.DrawImage(
masksource,
new Rectangle(0, 0, masksource.Width, masksource.Height),
0, 0, masksource.Width, masksource.Height,
GraphicsUnit.Pixel, imgattr
);
}
// Do something with the composited image here...
background.Save("Composited.png");
}
И результаты: ![Results](https://imgur.com/LEIdRsE.png)
Вы можете использовать ту же технику (с цветным ключом на Color.Fuchsia
), если вы хотите поместить эти кусочки дерева в другое изображение.
Удивительный и простой. Единственный недостаток, который я вижу здесь (который я должен был бы затронуть в вопросе), - это если я хочу прозрачный фон вместо Fuschia, он будет рисовать изображение внутри области извести, а также прозрачную область, правильно? – Brandon
Если пустая область маски (область фуксии в маске образца) прозрачна, вам понадобится другой метод. Вы можете нарисовать маску на фоне фуксии, чтобы получить маску выше, а затем цветную клавишу вывести выше на прозрачную растровую карту - одну операцию с дополнительным цветом, в основном. Для небольших растровых изображений, вероятно, лучше создать отсекающий регион - см. Статью Боба Пауэлла, которую я связал в своем ответе. – Corey