아니요, 더 많은 것이 있습니다. 아이콘은 꽤 정교한 내부 구조를 가지고 있으며 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 이미지에서 볼 수있는 "변두리"의 가능성에주의하십시오. 이미지가 잘 알려진 배경색으로 표시 될 때만 효과가 있습니다. 디자인 상으로는 아이콘을 절대 사용할 수 없습니다. 헌신적 인 아이콘 편집기는 항상 좋은 아이콘을 얻는 유일하고 진정한 좋은 방법 일 것입니다.