2014-01-22 4 views
1

Попытка выяснить самый элегантный способ визуализации изображения внутри определенного цвета маски на C# (через System.Drawing или эквивалент, который будет работать как в настольных, так и в ASP.NET-приложениях).Как сделать изображение с помощью зеленой маски с цветным ключом в C#?

Изображение маски будет содержать зеленые клавиши, в которых изображение должно быть «окрашено».

(Желаемый результат ниже изображение не является совершенным, рука lasso'd ...)

Desired Result

ответ

0

Вы могли бы прочитать в маске и перевести его в изображение, которое имеет множество альфа-канала для 0, когда пиксель зеленый, а альфа-канал установлен на 0xFF, когда пиксель - любой другой цвет. Затем вы можете нарисовать изображение маски поверх исходного изображения.

2

Вы хотите что-то вроде этого:

Bitmap original = new Bitmap(@"tree.jpg"); 
Bitmap mask = new Bitmap(@"mask.jpg"); 

int width = original.Width; 
int height = original.Height; 

// This is the color that will be replaced in the mask 
Color key = Color.FromArgb(0,255,0); 

// Processing one pixel at a time is slow, but easy to understand 
for (int y = 0; y < height; y++) 
{ 
    for (int x = 0; x < width; x++) 
    { 
     // Is this pixel "green" ? 
     if (mask.GetPixel(x,y) == key) 
     { 
      // Copy the pixel color from the original 
      Color c = original.GetPixel(x,y); 

      // Into the mask 
      mask.SetPixel(x,y,c); 
     } 
    } 
} 
3

Существуют различные методы для этого:

  1. пиксельные сканирования данных и построить изображение маски (как уже было предложено itsme86 и Моби Disk)

  2. Вариант сканирования, который создает область отсечения из маски и использует это при рисовании (см. this article от Bob Powell)

  3. Используйте цветные клавиши для маскировки в вызове 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

Вы можете использовать ту же технику (с цветным ключом на Color.Fuchsia), если вы хотите поместить эти кусочки дерева в другое изображение.

+0

Удивительный и простой. Единственный недостаток, который я вижу здесь (который я должен был бы затронуть в вопросе), - это если я хочу прозрачный фон вместо Fuschia, он будет рисовать изображение внутри области извести, а также прозрачную область, правильно? – Brandon

+0

Если пустая область маски (область фуксии в маске образца) прозрачна, вам понадобится другой метод. Вы можете нарисовать маску на фоне фуксии, чтобы получить маску выше, а затем цветную клавишу вывести выше на прозрачную растровую карту - одну операцию с дополнительным цветом, в основном. Для небольших растровых изображений, вероятно, лучше создать отсекающий регион - см. Статью Боба Пауэлла, которую я связал в своем ответе. – Corey

 Смежные вопросы

  • Нет связанных вопросов^_^