2014-12-01 4 views
4

저는 대학에서 컴퓨터 학습 문제를 연구하고 있습니다. 첫 번째 작업은 이미지를 흑백으로 변환하는 것입니다.이미지 투명도 제거

내 이미지에 투명성이 있고 문제를 제거하는 방법을 모르겠다.

내가 노력하고 무엇 :

public static Bitmap RemoveTransparency (Bitmap src) 
{    
    Bitmap target = new Bitmap (src.Size.Width, src.Size.Height); 
    Graphics g  = Graphics.FromImage (target); 

    g.Clear (Color.White);    
    g.DrawImage (src, 0, 0); 

    return target; 
} 

입력 영상의 예 :

My captcha image

"RemoveTransparency"호출 후 출력 이미지의 예 :

Output image

누가 무슨 일이 일어나는 지 아나? 배경색이 같고 글자가 같은 색으로 보입니다 ... 그리고 흰색으로 칠하면 내 배경이 검은 색입니까?

감사합니다.

+0

당신의'src' 이미지의 소스는 무엇입니까? 어떤면에서 "투명성"을 갖고 있습니까? 실제로 예인 경우 투명 픽셀의 알파 값이 0 인 32bpp 비트 맵, 게시 한 코드가 작동합니다. 따라서 원본 이미지와 관련하여 중요한 정보를 일부 생략하는 것은 아닙니다. 소스 비트 맵을 자체적으로 초기화하는 것을 포함하여 전체 코드 예제를 게시해야합니다. http://stackoverflow.com/help/mcve –

+0

을 참조하십시오. 기록 : 질문에 포함 된 정확한 이미지를 다운로드하고 질문에 코드를 실행 한 다음 결과를 새로운 .png 파일에 저장했습니다. 그리고 예상대로 잘 작동합니다. 대답은 코드에있는 다른 버그를 해결하기위한 해결 방법 일 수도 있지만 원래 비트 맵에서 사용한 비트 맵에서 찾은 투명도를 사용하는 것으로 예상하는 경우이를 수정하는 것은 실제로 올바른 방법이 아닙니다. 귀하의 질문에있어. –

+0

@PeterDuniho 여기에 잘못된 정보가 퍼지고 있습니다. 나는 또한 이미지를 다운로드했다. 투명 블랙 픽셀을 가지고 있습니다. 'Graphics' 객체의 디폴트'CompositingMode'는'SourceCopy'입니다. "... 결과를 새로운 .png 파일에 저장했습니다." PNG 파일에는 투명도가 있으므로 투명한 검은 픽셀이 출력됩니다. 알파 채널이없는 JPG에 저장해보십시오. 흰색 배경 위에 투명한 검은 색 픽셀을 그릴 때 알파 블렌딩이 사용되지 않았기 때문에 이미지가 모두 검정색임을 알 수 있습니다. –

답변

5

Graphics 개체의 CompositingModeSourceOver으로 설정해야 다른 이미지를 그 위에 그릴 수 있습니다.

g.Clear(Color.White); 
g.CompositingMode = CompositingMode.SourceOver; 
g.DrawImage(src, 0, 0); 

기본 CompositingMode 투명 블랙 복용 SourceCopy이다 (R = G = B = A = 0)하여 src 이미지 픽셀과 검은 색의 화소로 렌더링. SourceOver은 사용자가 찾고있는 알파 블렌딩을 수행합니다.

은 자세한 내용은 여기를 참조하십시오 : CompositingMode Enumeration

+0

도움을 주셔서 감사합니다. @Timothy, 계속 Bitmap을 사용할 수 있습니까? 아니면 이미지를 사용해야합니까? Bitmap =/ – Crasher

+0

@Crasher 여기에'Bitmap' 클래스를 사용하면 괜찮습니다. 나는 문제를 확실히 확신하고 위에서 설명한 바를 고친다. 여기에 설명 된 문제 옆에 뭔가 잘못된 것이 있어야합니다. –

+0

@TimothyShields : 원래 비트 맵에서 0,0,0의 RGB를 사용하여 투명 픽셀을 나타내는 경우 원래 비트 맵의 ​​검정색 숫자가 표시되는 이유는 무엇입니까? 그가 기사에 게시 한 비트 맵은 진정한 투명성을 가지며 그가 게시 한 코드로 잘 작동합니다. –