изображение уведомить выглядит ужасно, как только изображение попадает в системный трей - PullRequest
7 голосов
/ 20 сентября 2011

Я использую Visual Studio 2010, C #, в Windows 7.

Я добавил элемент управления уведомлением в свой проект и установил для него значок, который я импортировал в проект.Изображение значка действительно хорошо выглядит, если я просто его предварительно просматриваю, но как только я запускаю свой код и вижу его в системном трее, оно становится действительно ужасным, как будто стороны усеяны точками вместо прямых линий и так далее.Я пробовал 16x16, 24x24, 32x32 и 48x48 одного и того же файла, но у меня ужасные результаты.

Я что-то пропустил?

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

Ответы [ 2 ]

15 голосов
/ 24 марта 2014

Проблема с непосредственным использованием значка в ваших ресурсах состоит в том, что вместо выбора правильной версии значка в вашем файле значков платформа просто масштабирует версию значка по умолчанию до любого размера, необходимого области уведомлений.Вот почему вы видите зазубренные края.

Чтобы получить наилучшее качество, вам нужно самостоятельно выбрать правильный размер значка.

Во-первых, вместо непосредственной установки 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>
6 голосов
/ 21 сентября 2011

Изменить:

Информация, на которую я ссылаюсь, на данный момент кажется подозрительной. Попробуйте, но если это не сработает, тогда я предлагаю вам отредактировать свой вопрос, чтобы опубликовать скриншоты всех ваших экспериментов (каждый размер значка и как он масштабируется).

Оригинал:

32x32x256 - правильный размер и глубина цвета в соответствии с этой ссылкой:

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

Но вы должны быть очень осторожны при создании этого изображения:

  • Возьмите изображение 16x16x256 и сделайте так, чтобы оно выглядело хорошо
  • Удвойте его до 32x32 (будьте осторожны, чтобы не размывать и не повторять выборку, если делаете это в программе рисования)

Причина в том, что Windows «изменит» размер изображения 32x32 до 16x16, просто выбрасывая 3/4 пикселей. Ссылка выше демонстрирует это явление с парой скриншотов:

До:

Before shrinking icon

После того, как:

After shrinking icon

Я не уверен, сколько проблем с глубиной цвета (только 256 цветов?) / Проблемами с передискретизацией все еще остается в Windows 7, но, безусловно, это имеет место в XP.

...