In diesem Artikel wird hauptsächlich die Methode der verlustfreien Konvertierung von Bildern in Symbole in C# vorgestellt, die einen gewissen Referenzwert hat.
Wie der Titel schon sagt, sind die gängigen Methoden auf dem Markt:
var handle = bmp.GetHicon(); //得到图标句柄 return Icon.FromHandle(handle); //通过句柄得到图标
Das Problem bei dieser Methode besteht darin, dass, wenn das Bild einen transparenten Hintergrund hat, die Kanten des resultierenden Symbols rau sind, als ob zuerst eine Schicht Hintergrundfarbe aufgetragen und dann die Farbe entfernt würde , was nicht so gut ist wie Freunde, die es alle verwendet haben, wissen, dass es zufriedenstellend ist. Ich habe nicht untersucht, ob es ein Problem mit bmp.GetHicon oder Icon.FromHandle ist. Ich werde versuchen, daran herumzubasteln, wenn ich in Zukunft Zeit habe.
Die perfekte Konvertierungsmethode ist unten angegeben:
/// <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); } } }
Wie im Code gezeigt, ist das Prinzip der Methode:
1 Codieren Sie zuerst das Bild in PNG
2 und packen Sie dann das PNG so wie es ist in ein Symbol
Obwohl der erste Schritt die Neukodierung ist, ist PNG ein verlustfreies Format und die Bildqualität geht überhaupt nicht verloren . Fügen Sie dann das konvertierte PNG auf Binärebene intakt in das Symbol ein. Daher kann die gesamte Methode als „verlustfrei“ bezeichnet werden. Freunde, denen Verzerrungen auffallen, können sie gerne verwenden. Hinweis: Die Größe des Originalbilds wird in der Methode nicht überprüft oder verarbeitet. Stellen Sie daher sicher, dass die Größe des Originalbilds den Symbolspezifikationen entspricht, bevor Sie es übergeben. Außerdem ist die Methode nicht für die Zerstörung des Originalbilds verantwortlich. und der Anrufer sollte nach außen verantwortlich sein.
Das obige ist der detaillierte Inhalt vonAusführliche Erläuterung von Beispielen für die verlustfreie Konvertierung von Bildern in Symbole in C#. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!