2014-01-22 2 views
1

C#에서 특정 색상의 마스크 안에 이미지를 렌더링하는 가장 우아한 방법을 알아 내려고 노력하고 있습니다 (데스크톱 및 ASP.NET 응용 프로그램에서 모두 작동하는 System.Drawing 또는 이와 동등한 도구를 통해).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와 모비 디스크에 의해 제안) 마스크 이미지를 구축

  2. 마스크에서 클리핑 영역을 만들고이를 그리기 할 때 사용하는 변형입니다 (Bob Powell의 this article 참조).

  3. 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"); 
} 

그리고 : 당신이 당신의 마스크에서 제거 할 이미지의 색상이 우리가이 같은 Graphics.DrawImage에 통화 중 그려지에서 해당 색상 중 하나를 중지 ImageAttributes.SetColorKey를 사용할 수 Color.Lime이라고 가정

결과 : Results

트리의 해당 비트를 다른 이미지에 넣으려면 동일한 기술 (Color.Fuchsia의 색상 키 사용)을 사용할 수 있습니다.

+0

굉장하고 간단합니다. 내가 여기서 본 유일한 결점은 내가 Fuschia 대신에 투명한 배경을 원한다면, 투명 영역뿐만 아니라 Lime 영역 내부에도 이미지를 그릴 것인가? – Brandon

+0

빈 마스크 영역 (샘플 마스크의 자홍색 영역)이 투명하면 다른 방법이 필요합니다. 위의 마스크를 얻기 위해 마스크를 자홍색 배경에 그릴 수 있으며, 기본적으로 투명 비트 맵 위에 출력을 컬러 키 - 기본적으로 하나의 추가 컬러 키 조작. 작은 비트 맵의 ​​경우 클리핑 영역을 만드는 것이 더 좋습니다. Bob Powell의 필자는 제 대답에 링크되어 있습니다. – Corey