This article mainly introduces in detail the method of lossless conversion of Image to Icon in C#, which has certain reference value. Interested friends can refer to it
As the title says, the common methods on the market are :
var handle = bmp.GetHicon(); //得到图标句柄 return Icon.FromHandle(handle); //通过句柄得到图标
The problem with this method is that if the image has a transparent background, the edges of the resulting Icon will be rough, as if a layer of background color is applied first and then the color is removed, which is very unsatisfactory. Friends who have used it all know it. I haven't studied whether it is a problem with bmp.GetHicon or Icon.FromHandle. I will try to tinker with it when I have time in the future.
The perfect conversion method is given below:
////// 转换Image为Icon /// /// 要转换为图标的Image对象 /// 当image为null时是否返回null。false则抛空引用异常 ///public static Icon ConvertToIcon(Image image, bool nullTonull = false) { if (image == null) { if (nullTonull) { return null; } throw new ArgumentNullException("image"); } using (MemoryStream msImg = new MemoryStream() , msIco = new MemoryStream()) { image.Save(msImg, ImageFormat.Png); using (var bin = new BinaryWriter(msIco)) { //写图标头部 bin.Write((short)0); //0-1保留 bin.Write((short)1); //2-3文件类型。1=图标, 2=光标 bin.Write((short)1); //4-5图像数量(图标可以包含多个图像) bin.Write((byte)image.Width); //6图标宽度 bin.Write((byte)image.Height); //7图标高度 bin.Write((byte)0); //8颜色数(若像素位深>=8,填0。这是显然的,达到8bpp的颜色数最少是256,byte不够表示) bin.Write((byte)0); //9保留。必须为0 bin.Write((short)0); //10-11调色板 bin.Write((short)32); //12-13位深 bin.Write((int)msImg.Length); //14-17位图数据大小 bin.Write(22); //18-21位图数据起始字节 //写图像数据 bin.Write(msImg.ToArray()); bin.Flush(); bin.Seek(0, SeekOrigin.Begin); return new Icon(msIco); } } }
As shown in the code, the principle of the method is:
1. First encode the image into png
2, and then Pack the png into an icon as it is
Although step 1 is re-encoding, png is a lossless format and the image quality will not be lost at all. Then insert the converted PNG into the icon intact at the binary level. Therefore, the whole method can be said to be "lossless". Friends who mind distortion can feel free to use it. Note: The size of the original image is not checked or processed in the method, so please ensure that the size of the original image meets the icon specifications before passing it in; in addition, the method is not responsible for destroying the original image, and the caller should be responsible externally.
The above is the detailed content of Detailed explanation of examples of lossless conversion of Image to Icon in C#. For more information, please follow other related articles on the PHP Chinese website!