C#에서 특정 색상의 마스크 안에 이미지를 렌더링하는 가장 우아한 방법을 알아 내려고 노력하고 있습니다 (데스크톱 및 ASP.NET 응용 프로그램에서 모두 작동하는 System.Drawing 또는 이와 동등한 도구를 통해).C#에서 색상 키 그린 마스크로 이미지를 렌더링하는 방법은 무엇입니까?
마스크 이미지에는 이미지를 그린 '녹색'키가 포함됩니다.
(아래 원하는 결과 이미지가 완벽하지, 손 lasso'd는 ...)
C#에서 특정 색상의 마스크 안에 이미지를 렌더링하는 가장 우아한 방법을 알아 내려고 노력하고 있습니다 (데스크톱 및 ASP.NET 응용 프로그램에서 모두 작동하는 System.Drawing 또는 이와 동등한 도구를 통해).C#에서 색상 키 그린 마스크로 이미지를 렌더링하는 방법은 무엇입니까?
마스크 이미지에는 이미지를 그린 '녹색'키가 포함됩니다.
(아래 원하는 결과 이미지가 완벽하지, 손 lasso'd는 ...)
당신은 아마 마스크를 읽고에 알파 채널이 설정되어 이미지로 번역 할 수 픽셀이 녹색 인 경우 0, 픽셀이 다른 색상 인 경우 알파 채널이 0xFF로 설정됩니다. 그런 다음 원본 이미지 위에 마스크 이미지를 그릴 수 있습니다.
당신이 뭔가 싶어 :
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);
}
}
}
가 다양한 기술이위한 것입니다 :
스캔 픽셀 데이터가와 (이미 itsme86와 모비 디스크에 의해 제안) 마스크 이미지를 구축
을마스크에서 클리핑 영역을 만들고이를 그리기 할 때 사용하는 변형입니다 (Bob Powell의 this article
참조).
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
이라고 가정
결과 :
트리의 해당 비트를 다른 이미지에 넣으려면 동일한 기술 (Color.Fuchsia
의 색상 키 사용)을 사용할 수 있습니다.
굉장하고 간단합니다. 내가 여기서 본 유일한 결점은 내가 Fuschia 대신에 투명한 배경을 원한다면, 투명 영역뿐만 아니라 Lime 영역 내부에도 이미지를 그릴 것인가? – Brandon
빈 마스크 영역 (샘플 마스크의 자홍색 영역)이 투명하면 다른 방법이 필요합니다. 위의 마스크를 얻기 위해 마스크를 자홍색 배경에 그릴 수 있으며, 기본적으로 투명 비트 맵 위에 출력을 컬러 키 - 기본적으로 하나의 추가 컬러 키 조작. 작은 비트 맵의 경우 클리핑 영역을 만드는 것이 더 좋습니다. Bob Powell의 필자는 제 대답에 링크되어 있습니다. – Corey