>백엔드 개발 >C#.Net 튜토리얼 >C#에서 이미지를 아이콘으로 무손실 변환하는 예에 대한 자세한 설명

C#에서 이미지를 아이콘으로 무손실 변환하는 예에 대한 자세한 설명

Y2J
Y2J원래의
2017-04-22 10:17:392415검색

이 글에서는 C#에서 이미지를 아이콘으로 무손실 변환하는 방법을 주로 소개하는데, 관심 있는 친구들은 참고할 수 있습니다.

제목에서 알 수 있듯이 시중에서 흔히 사용되는 방법은 다음과 같습니다.

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

이 방법의 문제점은 이미지의 배경이 투명한 경우 마치 배경색 레이어를 먼저 적용한 다음 색상이 제거되는 것처럼 결과 아이콘의 가장자리가 거칠어진다는 것입니다. 매우 불만족스럽습니다. 사용해본 친구들은 다 알죠. 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. 먼저 이미지를 png로 인코딩합니다2. png를 그대로 아이콘에 담습니다

1단계에서 다시 인코딩하지만 png는 무손실 형식이므로 이미지 품질이 전혀 손상되지 않습니다. 그런 다음 변환된 PNG를 바이너리 수준에서 그대로 아이콘에 삽입합니다. 따라서 전체 방법은 "무손실"이라고 할 수 있습니다. 왜곡이 마음에 드는 친구는 자유롭게 사용할 수 있습니다. 참고: 원본 이미지의 크기는 메서드에서 확인되거나 처리되지 않으므로 원본 이미지의 크기가 아이콘 사양을 충족하는지 확인한 후 전달하세요. 또한 메서드는 원본 이미지를 파괴할 책임이 없습니다. 발신자는 외부적으로 책임을 져야 합니다.

위 내용은 C#에서 이미지를 아이콘으로 무손실 변환하는 예에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.