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

点击上方蓝字关注“汪宇杰博客”

640?wx_fmt=png

导语

前一阵我终于完成了博客系统动态生成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编辑器打开看看文件头部信息:

640?wx_fmt=png

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

复制粘贴,能跑就行

其实.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

使用方法样例:

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();

    }

}

640?wx_fmt=png

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

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

640?wx_fmt=gif

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/313069.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Visual Studio Online 东半球首秀,亮相 .NET Conf 2019 中国峰会

佷高兴能参加 .NET Conf 并演讲。看到 NET 社区这么活跃,也是非常开心!这次我演讲的主题是《Visual Studio Code —— .NET 开发利器》。找找我在哪?更多关于 Visual Studio Online 的四种开发模式,可以阅读这篇文章:最…

.NET Core 3.0 部署在docker上运行

自从.NET Core3.0发布之后,写了几篇关于.NET Core 3.0的文章,有助于你快速入门.NET Core3.0。本篇文章主要讲解如何一步步创建一个mvc项目,然后发布并部署在Docker上运行。需要你本地有docker环境1.创建一个站点创建一个ASP.NET Core Web应用…

2019 .NET China Conf:路一直都在,社区会更好

这个周末,我从成都飞到了上海参加了首届由社区组织而非官方(比如Microsoft)组织的.NET开发者峰会(.NET Conf)。为此,我特意请了两天的假(周五周六,对,我们是大小周&#…

“开源、共享、创新”, 中国最具前景开发者峰会落幕魔都

点击蓝字关注我们作者:张善友编辑:吴珊珊校正:潘淳、许豪、刘腾飞、朱兴亮、郑和阳、张潇、韩骏问卷制作:杨乐2019年,注定会是 .NET Core 社区发展的关键一年,诸多重大事件在这一年发生!正如大家…

GitHub 2019年度报告,用户超4000万

GitHub 发布了 2019 年年度报告《The State of the Octoverse》,下边来看看一些主要数据。全球用户超过 4 千万 目前 GitHub 上有超过 4000 万开发人员,其中有 80% 来自美国以外的地区。去年一年里有 1000 万新加入的开发者,2019 …

github 创建文件夹

https://blog.csdn.net/zhaomengszu/article/details/80354929 在我们不适用本地Git的情况下,我们怎么在网页上创建类似下图一样的文件夹呢 四步方法: 第一步:找到新增按钮 第二步:输入文件夹名,你想要用的文件夹名字。 第三步…

ML.NET 终于在Jupyter NoteBook 上跑起来了

对.NETer来说,刚结束的.NET Conf 2019是非常难忘的,毕竟这个个人觉得比微软在中国办的大会更加清真,当然现阶段.NET 已经不单跑在Windows的一项技术了,它可以跑在Linux/macOS/iOS/Android/IoT等,也可以融合当今最热门的…

2019.NET Conf China,.NET之崛起,已势不可挡

本文来自DotNET技术圈作者:邹溪源一、背景当今时代,气象更新,技术飞速发展。当今时代,开发者大概是最优秀的群体。每一位开发者,无不奋勇向前,努力追寻时代的步伐,以大无畏的精神迎接挑战&#…

PowerBI 11月更新 数据PPT是否会引领新一轮革命

PowerBI Desktop 2019年11月更新新鲜出炉了:罗叔作为全球第 80 人观看更新内容者,快速将本月更新全部奉上,供大家参考。 打开预览特性,如下:本次更新出了三大功能: Power Query 支持 AI新的功能区&#xff…

WeihanLi.Npoi 近期更新

WeihanLi.Npoi 近期更新Intro最近对我的 NPOI 扩展做了一些改变,一方面提高性能,一方面修复bug,增加一些新的功能来让它更加好用,前几天发布了 1.5.0 版本,下面来介绍一下最近的更新默认导入/导出格式变更在 1.5.0 版本…

【.NETCore 3】Ids4 ║ 多项目集成统一认证中心的思考

前言哈喽大家好,好久都没有写文章了,这次又重新开始写技术文章了,半年前我还是一直保持每周都写文章的,后来是为了响应群友的号召,开始踏上了录制视频(https://www.bilibili.com/video/av58096866&#xff…

.NET 社区 NB,2019 中国 .NET 开发者峰会

点击蓝字关注我们作为广州 .NET 技术俱乐部的一名成员,很荣幸以志愿者的身份见证并参与了 首届社区组织的中国 .NET 开发者峰会 ,这次大会共分为三天,第一天的 .NET 之夜,第二天的 .NET 开发者峰会,第三天的 .NET Core…

SQL Server 中 JSON_MODIFY 的使用

SQL Server 中 JSON_MODIFY 的使用IntroSQL Server 从 2016 开始支持了一些 JSON操作,最近的项目里也是好多地方直接用字段直接存成了 JSON,需要了解一下怎么在SQL Server 中操作 JSON.JSON支持适用于 SQL Server 2016 及以上版本 和 Azure SQL Database…

TypeScript 3.7稳定版发布

TypeScript 3.7 发布了,此版本带来了许多新特性。Optional Chaining首先一大亮点是 Optional Chaining,这是社区呼唤特别强烈的一个 ECMAScript 特性。最初它是 TypeScript 的 issue 跟踪器上第 16 个 issue,于 5 年前提交,要知道…

.NET手撸绘制TypeScript类图——上篇

.NET手撸绘制TypeScript类图——上篇近年来随着交互界面的精细化, TypeScript越来越流行,前端的设计也越来复杂,而 类图正是用简单的箭头和方块,反映对象与对象之间关系/依赖的好方式。许多工具都能生成 C#类图,有些工…

阅读源码学设计模式-单例模式

有些编码套路是公认的,大家都参照其编写符合可观赏性的代码,那就是设计模式现在.NETcore 默认提供了DI功能,那我想设计一个全局的引擎类,进行注入服务、解析服务、配置中间件。并且要求该引擎类全局唯一,其他地方不能进…

我终于知道post和get的区别

IT界知名的程序员曾说:对于那些月薪三万以下,自称IT工程师的码农们,其实我们从来没有把他们归为我们IT工程师的队伍。他们虽然总是以IT工程师自居,但只是他们一厢情愿罢了。码农:你知道get和post请求到底有什么区别&am…

【译】使用Blazor构建桌面应用

随着最近.NET Core 3的正式发布,我认为我会尝试一个有趣的小实验。我喜欢使用Electron来创建基于Web的桌面应用程序。我想了解有关Blazor(ASP.NET系列的最新成员)的更多信息。在这篇文章中,我将向您确切演示如何在15分钟内开始使用…

CAP的学习和应用

前言:用CAP有一段时间了,这里简单记录一下,这么好用的东西,小伙伴们赶紧上车吧一.CAP使用场景?平时工作中经常使用到MQ,如(kafka,rabbitmq...),用来简单的发布/订阅,经常会遇到以下几个问题常用方案,把SQL放前面,MQ放后面,MQ执行失败了,我们把整个SQL进行回滚,这种方案在单应用…

[功能发布]Excel催化剂地图可视化功能正式发布,欢迎使用!

地图可视化功能开发完成已过去1个多月,文章的阅读量与初定传播目标相差甚远。但因着热爱分享的缘故,在阅读量未及预期时,仍然破例对其功能进行发布。若真正喜爱Excel催化剂所开发的地图可视化,可通过完成小任务来获取使用资格。再…