C#中把Image无损转换为Icon的实例详解


当前第2页 返回上一页

下面给出完美转换方法:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

/// <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的实例详解的详细内容!

返回前面的内容

相关阅读 >>

详细介绍C#实例化接口对象的方法

原来斐波拉契数列还有这种写法,你知道吗?

C#开发实例-订制屏幕截图工具(三)托盘图标及菜单实现的图文介绍

关于C#代码convert.tochar(null);出现异常的详解(图)

详解C#获取本机ip地址(ipv4)的代码案例

C#是什么,能做些什么?

讲解什么是msmq

实现C#遍历文件夹及子目录下所有图片的示例代码分享

.net中C#集合的交集、并集、差集

C#使用反射来实现对象的深度复制的示例代码分享

更多相关阅读请进入《C#》频道 >>




打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...