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

导语

前一阵我终于完成了博客系统动态生成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

使用方法样例:

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位这样的……所以,具体场景还需要自己做对应的修改加以完善~

.NET Core 如何生成真正的ICO图标相关推荐

  1. 如何制作可以缩小放大尺寸的软件ICO图标

    要制作各种尺寸的ico图标,按照我们原来的想法应该是需要多个尺寸的ico图片合集.所以首先需要一个ico文件列表,然后把这个ico文件列表集成到exe中. 这是我一直以来的想法,但是一直没有做到过,就 ...

  2. 前端网站如何做ico图标教程

    我们可以自己做的图片,转换为 ico图标,以便放到我们站点里面.具体我们需要怎么做呢?总共我们分为3个步骤?: 可以选用ps或者fw工具,对想要的图标进行切图,使用切片工具,尽量使用透明图片,转换成p ...

  3. 如何制作并使用ico图标呢?

    什么是ico图标,通俗的讲就是我们打开一个网站的时候,比如说淘宝网,它会在网页的前面显示他们的图标,这个ico不是图片,所以需要用第三方网站来生成,具体如下: 那么如何来制作这种小图标呢? 1.首先我 ...

  4. 生成Mac icns应用软件图标和Windows ico不同尺寸的png图标最可靠的方式

    在线生成ico图标:ICO图标在线转换_ICO图标制作工具_PNG在线转ICO - ICO吧 生成icns和不同尺寸的png图标 第一步 准备 png 文件(示例中是 logo.png,分辨率 102 ...

  5. 怎么生成windows上的ico图标

    要生成 Windows 上的 ICO 图标,你可以使用专门的图标生成工具,比如说: IcoMaker:这是一款免费的图标生成工具,支持 Windows 和 Mac 平台.它可以让你轻松地将图像文件转换 ...

  6. 精简ICO图标可减小EXE程序文件大小

    精简ICO图标可减小EXE程序文件大小 使用VS2010编写的小程序,两百行不到的代码,生成的可执行程序却有3百多KB!心想不该如此之大才对.在下次编写小程序的时候,在刚建立解决方案的时候,生成的默认 ...

  7. ico图标在线制作工具以及带步骤(图文教程)

    ICO图标是Windows操作系统中常见的图标格式,用于表示文件.文件夹.应用程序等.但是制作这些ICO图标用桌面端软件去操作是比较麻烦的,从我个人而言更加倾向于在线工具 在线制作ICO图标的工具有很 ...

  8. 使用前端js代码开发了一个图片转ico图标的功能

    最近给自己的个人图像处理网站butterpig又新增加了一个在线的图片转ico功能,也是一键生成傻瓜式操作. 那么我们为什么需要favicon.ico图标呢? 首先,favicon即为favorite ...

  9. 在线透明favicon ico图标文件制作 - aTool在线工具

    原址:http://www.atool.org/ico.php 在线透明favicon ico图标文件制作 - aTool在线工具 支持格式 png.jpg.gif 在线转换成透明.ico图标. [图 ...

最新文章

  1. Spring Cloud Alibaba 学无止境:下一代微服务架构的规划与展望
  2. html如何让边框变圆,CSS怎样做出自适应圆形边框?
  3. Spring Cloud Alibaba基础教程:Sentinel使用Nacos存储规则
  4. 统计字符串中的英文字母的个数C++代码实现
  5. ZRender实现粒子网格动画实战
  6. “约见”面试官系列之常见面试题之第四十七篇之前端页面的组成(建议收藏)
  7. flask-稿件-环境依赖包的生成与安装-flask虚拟环境的布局
  8. Java实验8 T3.编程显示当前鼠标的位置坐标
  9. Dapper使用在WCF上总是说Service找不到
  10. 监听 oracle执行sql语句,oracle SQL语句的监控 - 数据库相关 - 7点测试网
  11. 机器学习数学基础二:泰勒公式与拉格朗日
  12. 18.06.27 16年期末11:张三丰的传人
  13. 输入圆半径 计算 直径 周长 面积
  14. lzg_ad:XPE的发布与部署步骤详解
  15. idea--Preferences
  16. 第九次java课堂笔记
  17. 【域名】查看MX记录是否生效
  18. uefi装完系统后无法引导_Win10用UEFI模式安装无法引导启动的原因分析及解决方法...
  19. 乐观数据:企业抖音蓝V账号获取流量运营的四个技巧
  20. 你真的知道如何选择内存条吗?

热门文章

  1. java publickey_数字证书中读取PublicKey
  2. pcu tps_Mac版Microsoft Office 2011重新定义您的TPS报告体验
  3. cdh中使用hue使用教程_我可以在户外使用Philips Hue灯泡吗?
  4. E-MapReduce上如何升级EMR-Core
  5. 4. MyBatis几个可以优化的地方
  6. 深入理解javascript函数
  7. 添加CSS的四种方式
  8. c++ memcpy与strcpy的比较
  9. 从部署 httpd 入手,理清 k8s 配置中的 containerPort、port、nodePort、targetPort
  10. Xamarin效果第十三篇之弹窗PopupPage