前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >.NET Core 如何生成真正的ICO图标

.NET Core 如何生成真正的ICO图标

作者头像
Edi Wang
发布2019-11-14 15:06:22
9910
发布2019-11-14 15:06:22
举报
文章被收录于专栏:汪宇杰博客汪宇杰博客

导语

前一阵我终于完成了博客系统动态生成favicon的功能。众所周知,favicon肯定有一个ico格式的图标,其余可以用 png + manifest 的方式输出。然而这个ICO格式让我小收福报,今天就给大家分享一下解决办法。

.NET自带API的问题

熟悉.NET的小伙伴可能知道,System.Drawing.Image上自己就有个Save方法,允许传入图片格式,包括ICU,哦不,ICO:

public void Save(string filename, ImageFormat format);

public sealed class ImageFormat

{

public ImageFormat(Guid guid);

public static ImageFormat Bmp { get; }

public static ImageFormat Emf { get; }

public static ImageFormat Exif { get; }

public static ImageFormat Gif { get; }

public static ImageFormat Icon { get; }

public static ImageFormat Jpeg { get; }

public static ImageFormat MemoryBmp { get; }

public static ImageFormat Png { get; }

public static ImageFormat Tiff { get; }

public static ImageFormat Wmf { get; }

public Guid Guid { get; }

public override bool Equals(object o);

public override int GetHashCode();

public override string ToString();

}

所以,当一张图变成Bitmap对象以后,可以调用这个方法去保存成各种格式。虽然看上去ICO也是可以的,但如果你真信了,那么保存出来的ICO实际上还是一个PNG,可以用HEX编辑器打开看看文件头部信息:

// 感觉就像打开一袋清真食品里面发现了猪肉铺一样……

复制粘贴,能跑就行

其实.NET生成ICO的问题,十几年前就遗留到了现在。.NET没有自带ICO的编码器,因此只能自己去完成编码。而这种事情显然是会996的。好在一个叫 Joshua Flanagan 的大神,在2004年就写了一套 .NET 编码 ICO 的库。我稍作修改后,也能跑在 .NET Core 3.0 下。前辈的牺牲,让今天的我们远离996,并且保住了头发。

修改后的库文件和我博客的源代码一同放在GitHub里,可以去这里复制:

https://github.com/EdiWang/Moonglade/tree/master/src/Moonglade.Web.FaviconGenerator/IconEncoder

使用方法样例:

代码语言:javascript
复制
private static void GenerateStandardFaviconIco(string originImagePath, string icoFilePath)
{
    var fs = new FileStream(originImagePath, FileMode.Open, FileAccess.Read);
    using (fs)
    {
        using var image = new Bitmap(fs);
        var ico = Converter.BitmapToIcon(image);
        using var icoFs = new FileStream(icoFilePath, FileMode.OpenOrCreate, FileAccess.ReadWrite);
        ico.Save(icoFs);
        icoFs.Flush();
    }
}

现在,生成的ICO文件里已经没有了PNG的信息。

当然,如果大家仔细研读源代码,会发现这个库里有不少hard code的地方,比如颜色深度是24位这样的……所以,具体场景还需要自己做对应的修改加以完善~

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-11-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 汪宇杰博客 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
区块链
云链聚未来,协同无边界。腾讯云区块链作为中国领先的区块链服务平台和技术提供商,致力于构建技术、数据、价值、产业互联互通的区块链基础设施,引领区块链底层技术及行业应用创新,助力传统产业转型升级,推动实体经济与数字经济深度融合。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档