【问题标题】:How to make smoother gradient background colors如何使渐变背景颜色更平滑
【发布时间】:2012-09-03 18:12:31
【问题描述】:

对渐变背景颜色使用 GradientPaint 并不总是令人满意,尤其是在某些尺寸下。例如这段代码:

public class TestPanel extends JPanel {

    protected void paintComponent( Graphics g ) {
        Graphics2D g2d = (Graphics2D) g;
        int w = getWidth();
        int h = getHeight();
        Color color1 = Color.BLACK;
        Color color2 = Color.GRAY;
        GradientPaint gp = new GradientPaint(0, 0, color1, 0, h, color2);
        g2d.setPaint(gp);
        g2d.fillRect(0, 0, w, h);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                JFrame frame = new JFrame();
                TestPanel panel = new TestPanel();
                frame.add(panel);
                frame.setSize(200,200);
                frame.setLocationRelativeTo(null);
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setVisible(true);
            }
        });
    }
}

产生以下内容:

循环版本看起来更糟糕:

如何使渐变看起来更平滑(在这两种情况下)?

编辑:

这似乎(至少部分)是显示器问题。渐变颜色在我的上网本(1024 x 600,真彩色 32 位)上看起来很糟糕,而在我的台式电脑(1280 x 1024,真彩色 32 位)上看起来要好得多。但是即使使用桌面显示器,结果仍然不是那么流畅。

两者都使用 Java 版本 6 Update 33。

这是否意味着应用程序只能在以更高分辨率查看时使用渐变背景?

编辑 2:

无论如何,对于那些面临类似问题或对此感兴趣的人,我认为让渐变颜色看起来更平滑的唯一解决方案就是更高的分辨率(当然假设显示器已经设置为真彩色)-并不是真正的解决方案。就像我在评论中所说的那样,我认为 1024 x 600 的分辨率对于简单的黑色到灰色渐变色就足够了,但似乎我错了。当在具有支持更高分辨率的显示器的计算机上运行相同的代码时,渐变看起来更好,例如通过我的桌面显示器 1280 x 1024。不幸的是,我没有更好的分辨率选项,但我相信它看起来会更平滑。我还注意到,我上传的两张图片(取自我的上网本)在通过更好的显示器查看时这些相同的图片看起来更平滑......所以它一定只是分辨率。

由于没有解决方案,我认为使用始终看起来平滑的特定渐变步骤(如黑色到灰色,即使在较低分辨率下看起来也很糟糕)的唯一方法是让 gui 程序测试用于启动时的分辨率并选择显示适当的渐变,但我不确定它是否值得。而使用较少的梯度步骤只是一种折衷方案。

由于缺乏更多/更好的响应,我已接受使用预抖动图像作为答案。

【问题讨论】:

  • 运行您的代码时的结果对我来说看起来不错。不过我看不到你的图片。
  • 你的意思是依赖机器?如果是这样,你知道为什么吗?
  • 等等,看不到我的图片是什么意思?它没有上传(我第一次提出问题)?
  • 没错,我看不到与您的帖子相关的图片。
  • @HovercraftFullOfEels 我可以在这里看到图片。无论如何,他面临的问题叫做梯度带。但是不确定如何防止这种情况。

标签: java swing background gradient java-2d


【解决方案1】:

我看到了您的图像,但无法重现条带。你的显示器设置为真彩色吗?您使用的是最新的 Java 版本吗?无论如何,以下行可能会有所帮助:

g2d.setRenderingHint(RenderingHints.KEY_DITHERING, RenderingHints.VALUE_DITHER_ENABLE);

编辑:Java 中似乎不支持 TrueColor 渐变的抖动,即使您没有足够的灰色阴影......一些想法:

  • 使用一些颜色
  • 使用预抖动的图像文件

http://en.wikipedia.org/wiki/Colour_banding

【讨论】:

  • 感谢您的提示,但它不起作用...是的,它设置为真彩色(32 位)
  • 预抖动图像是个好主意(但我认为抖动仍然有点明显)
  • 好吧,如果你使用图像,你可以完全控制每个像素,并达到最好的效果......
【解决方案2】:

我看得出来。我认为这是因为面板的尺寸和颜色数量不匹配。使其更平滑的一种方法是将面板的大小设置为渐变中颜色数量的偶数倍。它并不完美,但我不知道更好的方法。

public class TestPanel extends JPanel {

    private static final int scale = 2;
    private static final Color c1 = Color.BLACK;
    private static final Color c2 = Color.GRAY;
    private static final int size = (c2.getRed() - c1.getRed()) * scale;

    @Override
    public Dimension getPreferredSize() {
        return new Dimension(size, size);
    }

    @Override
    protected void paintComponent( Graphics g ) {
        Graphics2D g2d = (Graphics2D) g;
        int w = getWidth();
        int h = getHeight();
        GradientPaint gp = new GradientPaint(0, 0, c1, 0, h, c2);
        g2d.setPaint(gp);
        g2d.fillRect(0, 0, w, h);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                JFrame frame = new JFrame();
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(new TestPanel());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }
}

【讨论】:

  • 实际上,即使我以随机大小手动调整窗口大小,有时(只是一点点)可能会更平滑,但这就是问题所在:如何使其更平滑,尤其是在某些固定尺寸下。我认为即使是 1024 x 600 的分辨率(例如我的上网本的显示器)对于简单的小尺寸黑色到灰色渐变色也足够了,但现在我认为唯一的解决方案就是更高的分辨率......跨度>
  • 限制不是显示器的分辨率;它是七位灰度的数量:128。抖动是通常的解决方案,但KEY_DITHERING 取决于平台。
  • 好的,但是,改变分辨率仍然会影响渐变。我不知道分辨率是否与灰色的数量有关。有什么方法可以强制抖动(尽管它依赖于平台)?
  • KEY_DITHERING 在 Ubuntu 上没有做任何事情。您可以使用TexturePaint 中的代码来实现,例如here
猜你喜欢
  • 2012-07-10
  • 1970-01-01
  • 1970-01-01
  • 2022-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多