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

syn*_*cis 7 .net c# icons image notifyicon

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

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

我错过了什么吗?

myNotifyIcon.Icon = SysDir.Properties.Resources.icon2_32_ico_rgba;
Run Code Online (Sandbox Code Playgroud)

idm*_*adj 15

直接在资源中使用图标的问题是,框架只是将默认图标版本缩放到通知区域所需的大小,而不是在图标文件中选择正确的图标版本.这就是你看到锯齿状边缘的原因.

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

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

所以:

myNotifyIcon.Icon = new Icon(Properties.Resources.MyIcon, SystemInformation.SmallIconSize);
Run Code Online (Sandbox Code Playgroud)

现在,SystemInformation.SmallIconSize始终返回正确的图标大小,但仅当您的应用程序支持DPI时(否则,它始终返回16).如果您的应用程序不支持DPI,并且它在启用了DPI扩展的系统上使用,则上面的行将选择资源中的16x16图标,它将扩展到通知区域所需的任何大小(换句话说,丑陋的图标).

通过使您的应用程序支持DPI,SystemInformation.SmallIconSize将返回正确的大小,同时考虑到DPI扩展.例如,如果DPI缩放为150%,SystemInformation.SmallIconSize则返回24(16×1.5).

要使您的应用程序支持DPI,只需将其添加到<asmv1:assembly>标记内的app.manifest :

  <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>
Run Code Online (Sandbox Code Playgroud)


Mer*_*ham 6

编辑:

我联系的信息似乎在这一点上是可疑的.尝试一下,但如果它不起作用,那么我建议您编辑您的问题以发布所有实验的屏幕截图(每个图标大小及其缩放方式).

原版的:

根据此链接,32x32x256的大小和颜色深度正确:

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

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

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

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

之前:

在缩小图标之前

后:

缩小图标后

我不确定在Windows 7上有多少颜色深度挑剔(仅256色?)/重采样问题仍然存在,但在XP上肯定是这样.