Windows 8扭曲了我的托盘图标。

10

Windows 8 看起来将托盘图标设置为 20 x 20 像素大小。而 Java 仍然认为它们应该是 16 x 16 像素大小。这会导致一些严重的变形,因为 Java 要缩小图像,然后 Windows 再把它们放大回去。下面的示例使用这三个图像创建了三个托盘图标,看起来像这样(请注意畸变):

20x20 绿色图标 20x20 红色图标 16x16 蓝色图标

生成的托盘图标

import java.awt.Image;
import java.awt.SystemTray;
import java.awt.Toolkit;
import java.awt.TrayIcon;

public class TrayTest
{
    public static void main(String[] args) throws Exception
    {
        final SystemTray tray = SystemTray.getSystemTray();

        TrayIcon trayIcon16 = new TrayIcon(getImage("16pxBlue.png"));
        tray.add(trayIcon16);

        TrayIcon trayIcon20 = new TrayIcon(getImage("20pxRed.png"));
        tray.add(trayIcon20);

        TrayIcon trayIcon20autoSize = new TrayIcon(getImage("20pxGreen.png"));
        trayIcon20autoSize.setImageAutoSize(true);
        tray.add(trayIcon20autoSize);
    }

    public static Image getImage(String resource)
    {
        return Toolkit.getDefaultToolkit().createImage(TrayTest.class.getResource(resource));
    }
}

这是整个图像在加入像素线后的放大效果(在新标签页打开图片可以获得更清晰的视图):

图片描述

我的问题: 如何防止Java / Windows 8扭曲我的图标?


听起来有点显而易见,但正确的做法是提供20x20的图标,这样Windows 8才能使用它们。 - pablosaraiva
@pablosaraiva 你会注意到绿色和红色图标实际上是20x20的图标,Java将其缩小,然后Windows再放大--因此出现了失真。 - Lunchbox
对不起,我没有意识到。 - pablosaraiva
没关系,感谢您至少关注了这个问题! - Lunchbox
2个回答

3

16×16的大小显然是硬编码到Java TrayIcon实现中的。我没有看到在运行时更改它的方法。WTrayIconPeer.java

final static int TRAY_ICON_WIDTH = 16;
final static int TRAY_ICON_HEIGHT = 16;

这需要 报告为错误

作为解决方法,使用平滑的,抗锯齿的图标可以使畸变不那么明显。

如果你非常着急,你可以编写(或找到)使用JNA或JNI的托盘图标的另一种实现。在WTrayIconPeer.java 中的代码和awt_TrayIcon.cpp中的相应本地代码可能是一个指南。尽管看起来需要很多工作。


0

这可能只是使用2的幂次方图标的问题 - 16x16、32x32等。虽然本地操作系统(在您的情况下为Windows)支持它,但Java仅处理大小为2的幂次方的图像作为任务栏图标和程序图标。尝试将其调整为32x32并再次尝试。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接