Maison  >  Article  >  développement back-end  >  Explication détaillée d'exemples de conversion sans perte d'image en icône en C#

Explication détaillée d'exemples de conversion sans perte d'image en icône en C#

Y2J
Y2Joriginal
2017-04-22 10:17:392380parcourir

Cet article présente principalement la méthode de conversion sans perte d'image en icône en C#, qui a une certaine valeur de référence. Les amis intéressés peuvent s'y référer

Comme le titre l'indique, les méthodes courantes sur le marché sont :

var handle = bmp.GetHicon();  //得到图标句柄
return Icon.FromHandle(handle); //通过句柄得到图标

Le problème avec cette méthode est que si l'image a un fond transparent, les bords de l'icône résultante seront rugueux, comme si une couche de couleur d'arrière-plan était d'abord appliquée, puis la couleur était supprimée. , ce qui n'est pas aussi bon que les amis qui l'ont utilisé savent tous que c'est satisfaisant. Je n'ai pas encore étudié s'il s'agit d'un problème avec bmp.GetHicon ou Icon.FromHandle. J'essaierai de le bricoler quand j'aurai le temps dans le futur.

La méthode de conversion parfaite est donnée ci-dessous :

/// <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);
    }
  }
}

Comme indiqué dans le code, le principe de la méthode est :

1. Encodez d'abord l'image en png.
2, puis emballez le png dans une icône tel quel

Bien que la première étape soit le réencodage, le png est un format sans perte et la qualité de l'image ne sera pas perdue du tout . Insérez ensuite le PNG converti dans l'icône intact au niveau binaire. Par conséquent, l'ensemble de la méthode peut être considéré comme « sans perte ». Les amis qui craignent la distorsion peuvent l'utiliser librement. Remarque : la taille de l'image originale n'est pas vérifiée ou traitée dans la méthode, veuillez donc vous assurer que la taille de l'image originale répond aux spécifications de l'icône avant de la transmettre. De plus, la méthode n'est pas responsable de la destruction de l'image originale ; et l'appelant doit être responsable à l'extérieur.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn