首页 > 解决方案 > 是什么导致 Java JLabel 图标中的图像质量不佳?

问题描述

JavaJLabel图标在JFrame. 这与不同的 png 图像(所有 32x32)一致地发生。我没有缩放图像,它们显示在程序 32x32 中,我使用 JLabel 验证了该getWidth程序getHeight。每次运行程序时,失真都会出现在同一个地方,而不是随机出现。

使用下面提供的示例代码的屏幕截图。
示例截图 (1)

在此屏幕截图中,您可以看到一组 JLabel 图标,每个图标的影响不同。
示例截图 (2)

当从侧面调整窗口大小时,随着图标随窗口移动,扭曲像垂直线一样在图标上移动。

import javax.imageio.ImageIO;
import javax.swing.*;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.URL;

public class FrameApp extends JFrame
{
    public static void main(String[] args) throws IOException
    {
        FrameApp frameApp = new FrameApp();
    }

    private FrameApp() throws IOException
    {
        BufferedImage image;

        URL url = new URL("http://i.stack.imgur.com/L5DGx.png");
        image = ImageIO.read(url);

        JLabel label = new JLabel(new ImageIcon(image));

        add(label);

        pack();
        setVisible(true);
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    }
}

编辑:
我在 Windows 8.1 64 位上使用 JDK 11.0.3,Java SE Runtime Environment build 1.8.0_202。

标签: javaimageswingjlabelimageicon

解决方案


您可能认为您正在以 32x32 尺寸显示图像,但您的平铺图像示例表明并非如此。您有一个 9x2 的图标网格,应该是 288x64 像素,但在您的示例图像中,网格是 302x66。

如果您仔细检查您的平铺图像,您会看到各个平铺显示的宽度为 34 像素 - 请查看从 32 像素延伸到 66 像素的洋红色边框。(请注意,某些图块显示为 33 像素宽;它似乎是 33、34、34、33、34...)

为了将瓷砖拉伸到更宽的宽度,某些列被加倍(红色边框),这会产生您所看到的视觉故障。

提供的示例图像的标记部分

您是否尝试过修复 JLabel 的大小而不是允许它根据其内容调整大小?


推荐阅读