C# Winform 窗体美化(八、Icon)

八、Icon

之前 Winform 项目也有在 Icon 上遇到些问题(这里的 Icon 指的是 .ico 类型的文件),比如刚开始不知道怎么让自己的程序 Icon 和其他软件一样可以放大,还有放大之后在音量合成器中会出现比较奇葩的效果之类的问题,这里简单整理下,以后再有其他问题再补充。

1、C# 代码转换 Icon 格式

最开始写 Winform 程序的时候,程序图标都是从网上 down 的,因为那时候我下载了个精简版的ps cs3 里面不能保存 ico 文件,后来我找了个可以用 ps cs3 保存 ico 文件的插件,就可以保存 Ico 格式的文件了,最近突发奇想能不能用 C# 代码来转换 Icon 格式,这个例子在网上看过,有个网站可以将 Png 转换成 Ico,OK 既然有就可以试验一下。

网上最多的代码就是:

Bitmap iconBm = new Bitmap(oriImage, size);
Icon icon = Icon.FromHandle(iconBm.GetHicon());
//保存文件省略

这玩意儿确实能生成 Ico 格式的文件,但是这真的是个坑,因为生成的 Ico 是这样的:

渣画质的 Ico 对比效果

网上有这种困扰的人很多,大致看了下原因是颜色位数的问题,那肯定的,颜色少的也太多了……

不过随后找到一个文章,完美的做好了转换,引用地址:http://www.cnblogs.com/ahdung/p/ConvertToIcon.html

Icon 文件说明:https://msdn.microsoft.com/en-us/library/ms997538.aspx

作者的方法原理是:先将image编码为png;再将png原样包装成一个icon。在这要谢谢作者提供的方法,提供了新思路,完美解决问题。

这里顺便一贴方法代码(Save 方法是我顺手补的……):

/// <summary>
/// 将 Image(PNG) 保存到指定目录文件名的 Icon
/// </summary>
/// <param name="image"></param>
/// <param name="file"></param>
/// <returns></returns>
public static bool Save(Image image, string file)
{if (image != null){using (Icon icon = ConvertToIcon(image)){try{FileStream fs = new FileStream(file, FileMode.Create, FileAccess.Write);icon.Save(fs);fs.Flush();fs.Close();fs.Dispose();return true;}catch { }}}return false;
}/// <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保留。必须为0bin.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);}}
}

这个方法所转换的 Icon 是无损带透明的完美效果。

注:这里补充个小代码,是 OpenFileDialog 选择文件的:

OpenFileDialog 中可以设置 Filter 属性,默认不设置则可以选择所有文件,也可以限制只选自己需要的文件类型。
1. 限制一种文件类型:Filter=”照片|*.jpg”;
2. 限制同类多种文件类型:Filter=”照片|*.jpg;*jpeg;*png”;
3. 限制多种分类文件类型:Filter=”照片|.jpg;*jpeg;*png|音频|.mp3”;

代码如下:

//弹出打开图片对话框
OpenFileDialog fileDialog = new OpenFileDialog();
fileDialog.Filter = "图片文件|*.jpg;*.jpeg;*.png";
if (fileDialog.ShowDialog() == DialogResult.OK)
{//选择图片进行加载oriImagePath = fileDialog.FileName;
}

2、可放大的程序图标

用过 win7 的小伙伴大部分应该都知道的,按住 ctrl 键 + 鼠标滚轮 可以对程序图标放大缩小,但是固定尺寸的程序图标就不会跟着放大缩小,如图:

Icon 缩放效果

这种问题其实倒还是简单,因为 Icon 文件中可以放不同分辨率的图像,只需要在文件中创建高分辨率的版本就可以了:

Icon 多分辨率

创建多个分辨率的 Icon 之后,就不怕缩放问题了:

Icon 高分辨率

3、音量合成器的 Icon

沉积在可以放大图标的喜悦中之后,在给程序加声音的工作中,突然发现了个奇葩的东西:

音量合成器中的 Icon

我去~这是个什么鬼,在网上没查到是什么原因,我真是不知道怎么来描述这个问题……不过可以肯定是出在大分辨率的 Icon 上,既然这样,就再增加小分辨率的 Icon 进去。

IcoFx 增加小分辨率的 Icon

实验发现,增加48*48大小的 Icon 就可以恢复正常了,如图:

正常的音量合成器

4、IcoFX

IcoFX 确实是款不错的 Ico 文件编辑工具,上面的例子我也是用了这个软件编辑的 Ico,相比 visual studio 中的图像编辑器,IcoFX 操作更方便些,感兴趣的同学可以下载学习一下,软件有试用期,但是毕竟有注册机之类的神器啊,百度一下就可以了。

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

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

相关文章

MyBatis 的执行流程,学废了!

作者&#xff1a;双子孤狼来源&#xff1a;blog.csdn.net/zwx900102/article/details/108455514MyBatis可能很多人都一直在用&#xff0c;但是MyBatis的SQL执行流程可能并不是所有人都清楚了&#xff0c;那么既然进来了&#xff0c;通读本文你将收获如下&#xff1a;1、Mapper接…

C# Winform 窗体美化(九、嵌入窗体)

九、嵌入窗体 还是关于 Winform 窗体的一些操作问题&#xff0c;这次是研究了一个嵌入窗体&#xff0c;这次学习纯属偶然&#xff0c;项目中确实没遇到过这种需求。就是把别人的程序嵌入到自己的程序中&#xff0c;就像这样&#xff1a; 这里我嵌入了测试显示器的程序 [外链图…

SpringBoot 优雅的参数效验!

引言 不知道大家平时的业务开发过程中 controller 层的参数校验都是怎么写的&#xff1f;是否也存在下面这样的直接判断&#xff1f;public String add(UserVO userVO) {if(userVO.getAge() null){return "年龄不能为空";}if(userVO.getAge() > 120){return &quo…

NTFS Change Journal(USN Journal)详解

写在前面 最近又用了一下usn日志来获取所有文件列表&#xff0c;在分多次加载文件列表的时候发现有文件丢失的情况&#xff0c;后来发现一篇文章比较详细的讲了usn。 用cmd来读取usn日志 如图&#xff1a; 以下是转载内容&#xff1a; 还是那个文件监控的应用&#xff0c;…

绝,Java 中创建对象的 5 种方法!

我们日常生活中会创建很多对象&#xff0c;但是这个对象和你理解的那么对象不一样&#xff0c;因为作者不是女娲&#xff0c;不能造人。作者只是程序员&#xff0c;他只能在 Java 中创建对象。那么我问你一个问题&#xff0c;你知道 Java 中如何创建对象吗&#xff1f;这个问题…

C# Winform 窗体美化(十、自定义窗体)

十、自定义窗体 写在前面 最近在做 winform 应用程序&#xff0c;需要自定义一种窗口的样式&#xff0c;所以就随便搞了一个简单的窗口。 效果图 有两种样式&#xff0c;界面如下&#xff1a; 无标题&#xff1a; 有标题&#xff1a; 关键词 1、黑色描边边框 对于…

SpringBoot时间格式化的5种方法!

作者 | 王磊来源 | Java中文社群&#xff08;ID&#xff1a;javacn666&#xff09;转载请联系授权&#xff08;微信ID&#xff1a;GG_Stone&#xff09;在我们日常工作中&#xff0c;时间格式化是一件经常遇到的事儿&#xff0c;所以本文我们就来盘点一下 Spring Boot 中时间格…

C#文件加密和解密

下载 CSDN下载&#xff1a;https://download.csdn.net/download/myinc/9913318 Github&#xff1a;GitHub 如果没有积分&#xff0c;也可以关注我获取哟~【文件加密】 // * 最近看了一下加密算法&#xff0c;对加密文件突然很感兴趣&#xff0c;就研究了一下&#xff1a;…

SpringBoot 如何统一后端返回格式?老鸟们都是这样玩的!

大家好&#xff0c;我是磊哥。今天我们来聊一聊在基于SpringBoot前后端分离开发模式下&#xff0c;如何友好的返回统一的标准格式以及如何优雅的处理全局异常。首先我们来看看为什么要返回统一的标准格式&#xff1f;为什么要对SpringBoot返回统一的标准格式在默认情况下&#…

zabbix企业应用之监控docker容器资源情况

关于docker的监控&#xff0c;无论开源的CAdvisor、Data Dog还是我自己写的监控&#xff08;http://dl528888.blog.51cto.com/2382721/1635951&#xff09;&#xff0c;不是通过docker的stats api就是使用socket来进行。单独看一个主机的监控项还行&#xff0c;比如只查看容器t…

使用了synchronized,竟然还有线程安全问题!

线程安全问题一直是系统亘古不变的痛点。这不&#xff0c;最近在项目中发了一个错误使用线程同步的案例。表面上看已经使用了同步机制&#xff0c;一切岁月静好&#xff0c;但实际上线程同步却毫无作用。关于线程安全的问题&#xff0c;基本上就是在挖坑与填坑之间博弈&#xf…

序列图| 软件工程

什么是时序图&#xff1f; (What is Sequence Diagram?) Sequence Diagram is a "Connection Diagram" that represents a single structure or storyline executing in a system. It is the second most used UML diagram behind the class diagram. Sequence Diag…

终极解密输入网址按回车到底发生了什么?

详解输入网址点击回车&#xff0c;后台到底发生了什么。透析 HTTP 协议与 TCP 连接之间的千丝万缕的关系。掌握为何是三次握手四次挥手&#xff1f;time_wait 存在的意义是什么&#xff1f;全面图解重点问题&#xff0c;再也不用担心面试问这个问题。大致流程URL 解析&#xff…

unity, 相机空间 与 相机gameObject的局部空间

在unity里 相机空间 与 相机gameObject的局部空间 不重合。 Camera.worldToCameraMatrix的文档中有这样一句话&#xff1a; Note that camera space matches OpenGL convention: cameras forward is the negative Z axis. This is different from Unitys convention, where for…

Winform实现漂亮动画-小火车

一、起因 最近在做一个Winform的项目&#xff0c;其中需要一些加载动画&#xff0c;所以就搜索了一下找些思路&#xff0c;以下链接是本文的参考。 参考&#xff1a;Jeremie Martinez &#xff08;译文链接&#xff09; 注&#xff1a;原文中并没有给出图片资源&#xff0c;图…

synchronized 加锁 this 和 class 的区别!

作者 | 王磊来源 | Java中文社群&#xff08;ID&#xff1a;javacn666&#xff09;转载请联系授权&#xff08;微信ID&#xff1a;GG_Stone&#xff09;synchronized 是 Java 语言中处理并发问题的一种常用手段&#xff0c;它也被我们亲切的称之为“Java 内置锁”&#xff0c;由…

C# WinForm窗体四周阴影效果

一、起因 关于winform窗体无边框的问题很简单&#xff0c;只需要设置winform的窗体属性即可&#xff1a; FormBorderStyle FormBorderStyle.None; 但是这中无边框窗口实现的效果和背景完全没有层次的感觉&#xff0c;所以能加上阴影&#xff0c;突出窗口显示的感觉。 二、…

synchronized 优化手段之锁膨胀机制!

作者 | 王磊来源 | Java中文社群&#xff08;ID&#xff1a;javacn666&#xff09;转载请联系授权&#xff08;微信ID&#xff1a;GG_Stone&#xff09;synchronized 在 JDK 1.5 之前性能是比较低的&#xff0c;在那时我们通常会选择使用 Lock 来替代 synchronized。然而这个情…

NTFS USN的Create和工具代码汇总

1、 因为之前把相关代码放在了GitHub上&#xff0c;后来突然有人帮忙改了些个BUG&#xff0c;非常感谢 760193107&#xff0c;所以就写了个完整点的例子&#xff0c;希望对别人有所帮助。 GitHub项目地址 2、错误码&#xff1a;ERROR_JOURNAL_NOT_ACTIVE 在测试时&#xff…

在Java中,负数的绝对值不一定是正数!

作者 l Hollis来源 l Hollis&#xff08;ID&#xff1a;hollischuang&#xff09;绝对值是指一个数在数轴上所对应点到原点的距离&#xff0c;所以&#xff0c;在数学领域&#xff0c;正数的绝对值是这个数本身&#xff0c;负数的绝对值应该是他的相反数。这几乎是每个人都知道…