2012-05-18 13 views
9

이미지를 복사하고 있습니다. 내 실제 코드는 이미지 크기를 조정하고 있지만 내 질문과 관련이 없습니다. 내 코드는 다음과 같습니다.Graphics.DrawImage()를 사용하여 투명/알파 채널로 이미지 그리기

Image src = ... 

using (Image dest = new Bitmap(width, height)) 
{ 
    Graphics graph = Graphics.FromImage(dest); 
    graph.InterpolationMode = InterpolationMode.HighQualityBicubic; 
    graph.DrawImage(src, 0, 0, width, height); 
    dest.Save(filename, saveFormat); 
} 

이것은 src는 (예 : GIF 등) 투명 필름이나 (예 : PNG 등) 알파 채널 이미지에서로드되지 않는 한 잘 작동하는 것 같다.

DrawImage()을 사용하면 투명 필름/알파 채널을 새 이미지로 전송 한 다음 파일을 저장할 때 그대로 유지할 수 있습니까?

+0

질문은'saveFormat' 변수의 값은 무엇입니까? 'PixelFormat.Format32bppArgb' (또는 알파 채널이 처리 된 다른 형식)이어야합니다. 'Image dest = new Bitmap (width, height, PixelFormat.Format32bppArgb)) '를 사용해보십시오. –

+0

이것은 알파 채널에서는 작동하지만 GIF ​​투명 필름에서는 작동하지 않는 것 같습니다. 'saveFormat'은 입력 파일의 형식에 따라 다릅니다. 입력 파일이 알파 채널을 지원하지 않으면 이미지에 알파 채널 픽셀이 포함되지 않는다고 가정하는 것이 안전합니다. –

+0

그럼, GIF 파일을위한'saveFormat'의 가치는 무엇입니까 :)? –

답변

22

꽤 불분명합니다. 당신이 말하지 않은 것이 많이 있습니다. 투명성의 가장 큰 문제점은 당신이 그것을 볼 수 없다는 것입니다. 몇 단계를 건너 뛰어 새 비트 맵의 ​​픽셀 형식을 명시 적으로 지정하지 않았 으면 초기화하지 않았고 사용하는 출력 형식을 말하지 않았습니다. 일부는 투명성을 지원하지 않습니다. 그래서 그것을 명백하게하는 버전을 만들어 봅시다. paint.net에서 다음과 같습니다 PNG 이미지에서 :

enter image description here

당신은을 명확하게 볼 수 있습니다

enter image description here

이 이미지를이 코드

 using (var src = new Bitmap("c:/temp/trans.png")) 
     using (var bmp = new Bitmap(100, 100, PixelFormat.Format32bppPArgb)) 
     using (var gr = Graphics.FromImage(bmp)) { 
      gr.Clear(Color.Blue); 
      gr.DrawImage(src, new Rectangle(0, 0, bmp.Width, bmp.Height)); 
      bmp.Save("c:/temp/result.png", ImageFormat.Png); 
     } 

를 생산하고 사용 파란색 배경 그래서 투명도 효과.

+1

음, 내 의도는 입력 파일과 일치하는 형식을 지원하는 것이 었습니다. 나는 꽤 구체적이라고 생각했다. 코드가 하나의 파일 유형 만 지원하는 것은 아닙니다. 아마도 각 파일 유형을 처리하는 코드가 필요합니다. 잘 모르겠습니다. 필자는 PixelFormat을 지정하려고 시도했지만 파일 형식이 투명도가있는 GIF 인 경우 오류가 발생하는 것처럼 보였습니다. 사실 PixelFormat을 지정하지 않으면 PNG로 일부 변형 된 것처럼 보였습니다. –

+0

@JonathanWood는 이전 비트 맵의 ​​너비와 높이 및 원하는 새로운 형식으로 새 비트 맵을 만듭니다. 바람직하게는'using' 문에서'FromImage ('새 비트 맵') 및'DrawImage ('이전 비트 맵')'Graphics 객체를 생성하십시오. –