转 无损转换Image为Icon

不可取

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

 

可取

/// <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

转载于:https://www.cnblogs.com/xiangxiong/p/6437253.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值