一旦图像出现在系统托盘中,notifyicon 图像看起来很糟糕

Posted

技术标签:

【中文标题】一旦图像出现在系统托盘中,notifyicon 图像看起来很糟糕【英文标题】:notifyicon image looks terrible once image ends up in system tray 【发布时间】:2011-09-20 19:50:57 【问题描述】:

我在 Windows 7 上使用 Visual Studio 2010,C#。

我在我的项目中添加了一个通知控件,并将其设置为我已导入到项目中的图标。如果我只是预览它,图标图像真的很好看,但是一旦我运行我的代码并在系统托盘中看到它,那么它真的很糟糕,就像边是点而不是直线等等。我尝试过 16x16、24x24、32x32 和 48x48 的同一个文件,但结果很糟糕。

我错过了什么吗?

myNotifyIcon.Icon = SysDir.Properties.Resources.icon2_32_ico_rgba;

【问题讨论】:

需要截图。尝试将颜色内容限制为 8bpp(256 色)。 这台机器上的小图标大小是多少? @Hans Passant : 变形的不仅仅是颜色,还有尺寸。 @David Heffernan:我调用了一个 API 来检查图标的大小,它说 16x 【参考方案1】:

直接在资源中使用图标的问题在于,框架没有在图标文件中选择正确的图标版本,而是简单地将默认图标版本缩放到通知区域所需的任何大小。这就是您看到锯齿状边缘的原因。

要获得最佳质量,您需要自己在图标中选择合适的尺寸。

首先,不要直接将NotifyIcon.Icon 设置为资源中的图标,而是创建一个新的Icon 实例。这样做将允许您在图标资源中选择特定的图标大小。使用SystemInformation.SmallIconSize 可以获得通知区域所需的大小。

所以:

myNotifyIcon.Icon = new Icon(Properties.Resources.MyIcon, SystemInformation.SmallIconSize);

现在,SystemInformation.SmallIconSize 始终返回正确的图标大小,但前提是您的应用程序可识别 DPI(否则,它始终返回 16)。如果您的应用程序不支持 DPI,并且在启用了 DPI 缩放的系统上使用,则上面的行将选择资源中的 16x16 图标,它将被缩放到通知区域需要的任何大小(换句话说,丑陋的图标)。

通过让您的应用能够识别 DPI,SystemInformation.SmallIconSize 将返回正确的大小,同时考虑到 DPI 缩放。例如,如果 DPI 缩放为 150%,SystemInformation.SmallIconSize 将返回 24 (16 × 1.5)。

要让您的应用具有 DPI 感知能力,只需将其添加到您的 app.manifest 中的 <asmv1:assembly> 标记内:

  <asmv3:application xmlns:asmv3="urn:schemas-microsoft-com:asm.v3" >
    <asmv3:windowsSettings xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">
      <dpiAware>true</dpiAware>
    </asmv3:windowsSettings>
  </asmv3:application>

【讨论】:

你认为这个概念应该应用于WPF窗口图标吗?我发现在 WPF 中,尽管我生成了 .ico 文件,其范围从 16x16 一直到 256x256,但这些图标通常不能很好地缩放。 太好了,非常感谢!【参考方案2】:

编辑:

此时我链接的信息似乎值得怀疑。尝试一下,但如果它不起作用,那么我建议您编辑您的问题以发布您所有实验的屏幕截图(每个图标大小及其缩放方式)。

原文:

根据此链接,32x32x256 是正确的尺寸和颜色深度:

http://www.hhhh.org/cloister/csharp/icons/

但是在构建该图像时您必须非常小心:

拍摄一张 16x16x256 的图片,让它看起来不错 将其加倍为 32x32(如果在绘图程序中执行此操作,请注意不要模糊或重新采样)

原因是 Windows 会通过简单地丢弃 3/4 像素来将 32x32 图像“调整”为 16x16。上面的链接通过几个屏幕截图演示了这种现象:

之前:

之后:

我不确定在 Windows 7 上存在多少颜色深度挑剔(仅限 256 色?)/重采样问题,但在 XP 上似乎确实如此。

【讨论】:

这个链接似乎有更多关于各种颜色深度和大小的信息,虽然没有提到通知图标:msdn.microsoft.com/en-us/library/ms997636.aspx 当然不应该是 32px。应该是小图标的大小,一般是 16px.on 大小,一般是 16px。 我尝试将 16x 图片作为图标,它看起来“最”正常。 @David:是的,缩放总是导致不太完美的结果。但是根据那篇文章,它会为您缩放。你别无选择 - 你只需要解决它。 @David:我不会与你的经验争论或为这篇文章辩护。只是想确保你不同意我提出的观点,而不是我没有试图提出的观点:) 我同意汉斯的“需要截图”的评论。多个...

以上是关于一旦图像出现在系统托盘中,notifyicon 图像看起来很糟糕的主要内容,如果未能解决你的问题,请参考以下文章

在 C# 托盘中拖放 NotifyIcon

WinForm 之 窗口最小化到托盘及右键图标显示菜单

托盘程序菜单位置 NotifyIcon menu position

C# 公共控件之NotifyIcon 将窗口最小化到托盘

C# 实现WinForm窗口最小化到系统托盘代码,并且判断左右鼠标的事件

修改任务管理器中的应用程序图标,而不是系统托盘中的应用程序图标