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#_调用封装的一个类实现导出excel表格的功能

C# 常用函数总集

实现C#listview点击列头排序的示例代码分享

C#获取鼠标在listview右键点击单元格的内容方法详解

c#cs与bs数据请求交换

详细介绍C#数学运算表达式解释器的示例代码

C#开发实例-订制屏幕截图工具(七)添加放大镜功能的代码示例

详细介绍C#消息提示框messagebox的使用

C#实现一个简单的http服务器

.net框架-微软给出的C#编程风格代码实例

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




打赏

取消

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

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

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

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

评论

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