2011-02-04 6 views
5

투명한 PNG 이미지를 ImageSource로 변환하려면 PNG의 투명도를 고려한 System.Drawing.Icon으로 변환해야합니다.투명한 PNG를 System.Drawing.Icon으로 변환

WPF는 PNG ImageSource로 창 아이콘을 설정하면 내부적으로이 작업을 수행 할 수 있지만 수동으로 수행 할 수있는 방법이 있습니까? 특히 시스템 트레이 알림 아이콘을 설정하기 위해이 설정이 필요하며 정말 서투른 .ico 형식의 리소스를 사용하지 않으려합니다.

+0

참고로 windows vista +는 실제로 PNG 형식의 .ico 파일을 지원합니다. 이 방법이 효과가 있습니까? http://blogs.msdn.com/b/oldnewthing/archive/2010/10/22/10079192.aspx – MerickOWA

+0

.NET에 PNG에서 .ico를 빌드하는 데 사용할 수있는 유틸리티/함수가없는 한 날으십시오 ... 잘 알아, tho. – devios1

+0

@chaiguy http://www.hardcodet.net/projects/wpf-notifyicon을 사용하여 WPF 시스템 트레이 작업을 수행 한 적이 있습니까? – MerickOWA

답변

6

당신은

Icon.FromHandle(image.GetHIcon()) 

You'll need to explicitly destroy the icon when you're done with it을 작성할 수 있습니다

[DllImport("user32.dll", CharSet = CharSet.Auto)] 
extern static bool DestroyIcon(IntPtr handle); 

DestroyIcon(newIcon.Handle); 
+0

여기에서 주제를 완전히 벗어나지 만, 중재자 선거에 대한 찬사, @SLaks! –

+0

여기에있는 문제는 GetHIcon()이 ImageSource가 아닌 Bitmap의 메서드이며 ImageSource에서 비트 맵을 가져 오는 정상적인 방법이 아닌 것처럼 보입니다. (발견 된 한 가지 방법은 약 20 행이었습니다.)는 PNG 투명성을 유지하지 않습니다. – devios1

1

을 나는이 ~ 을 찾고 있어요 여기에 하나이지만, 매우 좋지 않다!

 Icon icon; 
     Image source = Image.FromFile(picturefile, true); 

     Bitmap target = new Bitmap(iconsize, iconsize, 
      System.Drawing.Imaging.PixelFormat.Format32bppArgb); 

     Graphics g = Graphics.FromImage(target); 
     g.DrawImage(source, 0, 0, iconsize, iconsize); 

     //target.Save("c:\\temp\\forest.bmp"); 

     icon = Icon.FromHandle(target.GetHicon()); 

     FileStream fs = File.Create(iconfile); 
     icon.Save(fs); 
     fs.Close(); 

     icon.Dispose(); 
     target.Dispose(); 
     source.Dispose(); 
관련 문제