如题,市面上罕见的要领是:
var handle = bmp.GetHicon(); //获得图标句柄 return Icon.FromHandle(handle); //经由过程句柄获得图标
此法的题目是,假如图象是通明背景,那末获得的Icon的边沿就是粗糙的,像是先垫了一层背景色然后再去色的结果,很不如人意,用过的朋侪都晓得。还没有研讨是bmp.GetHicon出的题目,照样Icon.FromHandle有题目,往后有闲心再捣鼓下。
下面给出圆满转换要领:
/// <summary> /// 转换Image为Icon /// </summary> /// <param name="image">要转换为图标的Image对象</param> /// <param name="nullTonull">当image为null时是不是返回null。false则抛空援用非常</param> /// <exception cref="ArgumentNullException" /> 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); } } }
如码所示,要领的道理是:
1、先将image编码为png
2、再将png原样包装成一个icon
第1步虽然是重编码,但png是无损花样,图象质量不会有涓滴丧失。然后在二进制层面一成不变的把转换获得的png塞入图标。所以全部要领担得起【无损】的说法,介怀失真的朋侪请放心使用。注重:要领中并未对原图size做搜检、处置惩罚,所以请先确保原图的尺寸相符图标规格再传入;别的,不担任烧毁原图,请调用者在外部担任。
以上就是C#中把Image无损转换为Icon的实例详解的细致内容,更多请关注ki4网别的相干文章!