Heim > Backend-Entwicklung > C#.Net-Tutorial > Ausführliche Erläuterung von Beispielen für die verlustfreie Konvertierung von Bildern in Symbole in C#

Ausführliche Erläuterung von Beispielen für die verlustfreie Konvertierung von Bildern in Symbole in C#

Y2J
Freigeben: 2017-04-22 10:17:39
Original
2424 Leute haben es durchsucht

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); //通过句柄得到图标
Nach dem Login kopieren

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);
    }
  }
}
Nach dem Login kopieren

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!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage