2012-09-03 218 views
1

對漸變背景顏色使用漸變繪畫並不總是令人滿意,特別是在某些尺寸下。例如下面的代碼:如何製作更平滑的漸變背景顏色

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); 
      } 
     }); 
    } 
} 

產生如下:

non-cyclic

循環版本看起來比這還要糟糕:

cyclic

我怎樣才能讓漸變外觀更平滑(在這兩種情況下)?

編輯:

看來,這是(至少部分)監測問題。我的筆記本電腦(1024 x 600,真彩色32位)上的漸變色看起來很糟糕,而我的臺式電腦(1280 x 1024,真彩色32位)看起來好多了。但即使使用臺式機的顯示器,結果仍然不那麼流暢。

兩者都使用Java版本6更新33

這是否意味着,當它與更高的分辨率觀看的應用程序應該只使用漸變背景?

編輯2:

不管怎麼說,對於那些面臨simlar問題,或者是在這個有興趣,我認爲,對於一個漸變的顏色看起來更平滑唯一的解決辦法就是更高的分辨率(假設顯示器已經設置到當然真正的顏色) - 這不是一個真正的解決方案。就像我在評論中所說的那樣,我認爲1024 x 600的分辨率對於簡單的黑色到灰色漸變色就足夠了,但似乎我錯了。當在具有支持更高分辨率的顯示器的計算機上運行相同的代碼時,漸變看起來更好,就像通過我的臺式機顯示器1280 x 1024一樣。不幸的是,我沒有更好的分辨率選項,但我相信它看起來更平滑。我還注意到,當我通過更好的顯示器觀看這些相同的圖像時,我上傳的兩張圖像(從我的上網本中獲取)看起來更平滑......所以它必須只是分辨率。

由於沒有解決方案,我認爲只有使用特定的梯度步驟才能看起來平滑的唯一方法(如黑到灰,即使在較低分辨率下看起來很糟糕),也應該有gui程序測試啓動時的分辨率,並選擇顯示適當的漸變,但我不確定是否值得。而使用較少的梯度步驟只是一個妥協。

由於缺乏更多/更好的迴應,我接受使用預先抖動的圖像作爲答案。

+0

結果,當我運行你的代碼看起來相當不錯。雖然我看不到你的圖像。 –

+0

你的意思是它取決於機器?如果是這樣你知道爲什麼? – Rempelos

+0

等一下,你是什麼意思,你看不到我的形象?它沒有上傳(第一次我把圖像問題)? – Rempelos

回答

2

我看到您的圖片,但無法重現綁定。你的顯示器是否設置爲TrueColor?你在使用最近的Java版本嗎?不管怎樣,下面的行可能會幫助:

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

編輯:似乎在抖動的Java不支持真彩色漸變,即使你沒有灰色色調不夠...一些想法:

  • 使用一些顏色
  • 使用的預抖動的圖像文件

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

+0

感謝您的提示,但它沒有工作...是的,它設置爲真彩色(32位) – Rempelos

+0

Java版本6更新33 – Rempelos

+0

預抖圖像是一個好主意(但仍抖動是我覺得有點可見) – Rempelos

2

我可以看到它。我認爲這是因爲面板的大小和顏色的數量不匹配。使其更平滑的一種方法是使面板的大小成爲漸變中顏色數量的偶數倍。這並不完美,但我不知道更好的方法。

enter image description here

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); 
      } 
     }); 
    } 
} 
+0

其實,即使我手動調整窗口大小隨機大小,它可能有時(只是一點點)更平滑,但這是一個問題:如何使它更平滑,特別是在某些固定大小的情況下。我認爲即使是1024 x 600分辨率(例如,我的上網本顯示器)也足夠用於簡單的小尺寸黑色灰度漸變顏色,但現在我相信唯一的解決方案就是更高的分辨率... – Rempelos

+0

極限不是顯示器的分辨率;它是七個灰度的數量:128.抖動是通常的但是'KEY_DITHERING'是平臺依賴的。 –

+0

好的,但仍然會改變分辨率對漸變有影響。不過,我不知道決議是否必須對灰色數量做任何事情。有沒有辦法強制抖動(儘管它是平臺依賴的)? – Rempelos