2014-01-27 5 views
7

아이콘을 표시하기 전에 아이콘으로 변환해야하는 PNG 이미지가 있습니다.투명도를 잃지 않고 이미지를 아이콘으로 변환하는 방법은 무엇입니까?

이 내가 그것을 어떻게 있습니다 : 예상대로

public Icon ImageToIcon(Image imgTest) 
{ 
    Bitmap bitmap = new Bitmap(imgTest); 
    Icon icoTest; 

    IntPtr iPtr = bitmap.GetHicon(); 
    icoTest = (Icon) Icon.FromHandle(iPtr).Clone(); 

    return icoTest; 
} 

내가이 일을 한 후 투명성을 잃고, 알파 투명 이미지는이를 해결할 수 있습니다 .... 렌더링되지 않습니다?

답변

10

아니요, 더 많은 것이 있습니다. 아이콘은 꽤 정교한 내부 구조를 가지고 있으며 1980 년대 하드웨어에 합리적으로 작동하도록 최적화되어 있습니다. 아이콘 이미지에는 세 개의 비트 맵, 하나는 아이콘, 이미지의 어떤 부분이 투명한지 나타내는 흑백 비트 맵 및 어떤 부분이 반전되었는지를 나타내는 흑백 비트 맵이 있습니다. 그 모노크롬 비트 맵을 생성하는 것은 꽤 어렵습니다. .NET은 그들을 지원하지 않습니다. Bitmap.GetHicon()도이를 시도하지 않습니다. 이 작업을 수행하려면 라이브러리가 필요합니다.

Vista는 약간의 안도감을 주었고 PNG 이미지가 포함 된 아이콘을 지원하기 시작했습니다. 자신 만의 코드로 생성 할 수 있습니다. 이와 같이 :

public static Icon IconFromImage(Image img) { 
     var ms = new System.IO.MemoryStream(); 
     var bw = new System.IO.BinaryWriter(ms); 
     // Header 
     bw.Write((short)0); // 0 : reserved 
     bw.Write((short)1); // 2 : 1=ico, 2=cur 
     bw.Write((short)1); // 4 : number of images 
     // Image directory 
     var w = img.Width; 
     if (w >= 256) w = 0; 
     bw.Write((byte)w); // 0 : width of image 
     var h = img.Height; 
     if (h >= 256) h = 0; 
     bw.Write((byte)h); // 1 : height of image 
     bw.Write((byte)0); // 2 : number of colors in palette 
     bw.Write((byte)0); // 3 : reserved 
     bw.Write((short)0); // 4 : number of color planes 
     bw.Write((short)0); // 6 : bits per pixel 
     var sizeHere = ms.Position; 
     bw.Write((int)0);  // 8 : image size 
     var start = (int)ms.Position + 4; 
     bw.Write(start);  // 12: offset of image data 
     // Image data 
     img.Save(ms, System.Drawing.Imaging.ImageFormat.Png); 
     var imageSize = (int)ms.Position - start; 
     ms.Seek(sizeHere, System.IO.SeekOrigin.Begin); 
     bw.Write(imageSize); 
     ms.Seek(0, System.IO.SeekOrigin.Begin); 

     // And load it 
     return new Icon(ms); 
    } 

.NET 4.5 및 Windows 8.1에서 테스트되었습니다. 가장자리에 투명도가있는 PNG 이미지에서 볼 수있는 "변두리"의 가능성에주의하십시오. 이미지가 잘 알려진 배경색으로 표시 될 때만 효과가 있습니다. 디자인 상으로는 아이콘을 절대 사용할 수 없습니다. 헌신적 인 아이콘 편집기는 항상 좋은 아이콘을 얻는 유일하고 진정한 좋은 방법 일 것입니다.

관련 문제