1

グラデーションの背景色に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、True Color 32ビット)ではひどく見えますが、デスクトップPC(1280 x 1024、True Color 32ビット)でははるかに見栄えがします。しかし、デスクトップのモニターを使用しても、結果はまだそれほどスムーズではありません。

どちらもJavaバージョン6アップデート33を使用しています。

それは、アプリケーションがより高い解像度で表示される場合にのみグラデーションの背景を使用する必要があることを意味しますか?

編集2:

とにかく、同様の問題に直面している人やこれに興味がある人にとって、グラデーションカラーをより滑らかに見せるための唯一の解決策は、解像度を高くすることだと思います(もちろん、モニターがすでにトゥルーカラーに設定されていると仮定します)-これは実際にはそうではありません解決策。コメントで言ったように、単純な黒から灰色へのグラデーションカラーには1024 x 600の解像度で十分だと思いましたが、私は間違っていたようです。同じコードを、より高い解像度をサポートするモニターを備えたコンピューターで実行すると、デスクトップのモニターである1280 x 1024のように、グラデーションがより良く見えます。残念ながら、より良い解像度のオプションはありませんが、さらにスムーズに見えると思います。また、アップロードした2つの画像(ネットブックから取得)をより良いモニターで表示すると、これらの同じ画像がより滑らかに見えることに気付きました...

解決策がないので、常に滑らかに見える特定のグラデーションステップを使用する唯一の方法(低解像度では見栄えが悪いように見える黒から灰色のように)は、GUIプログラムで解像度をテストすることだと思います起動して適切なグラデーションを表示することを選択しますが、それが価値があるかどうかはわかりません。そして、より少ない勾配ステップを使用することは、妥協点にすぎません。

より多くの/より良い応答がないため、私は答えとして事前にディザリングされた画像の使用を受け入れました。

4

2 に答える 2

2

私はそれを見ることができます。パネルのサイズと色数が合わないからだと思います。滑らかにする1つの方法は、パネルのサイズをグラデーションの色数の偶数倍にすることです。完璧ではありませんが、もっと良い方法はわかりません。

ここに画像の説明を入力してください

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);
            }
        });
    }
}
于 2012-09-04T14:02:39.177 に答える
2

あなたの画像は見えますが、バンディングを再現できません。ディスプレイをTrueColorに設定していますか?最近のJavaバージョンを使用していますか?とにかく、次の行が役立つかもしれません:

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

編集:十分なグレーの色合いがない場合でも、TrueColorグラデーションのJavaではディザリングがサポートされていないようです...いくつかのアイデア:

  • いくつかの色を使用する
  • ディザリング済みの画像ファイルを使用する

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

于 2012-09-03T18:42:23.703 に答える