2013-04-08 63 views
1

我已經搜索了一段時間,但一直未能找到我的問題的答案。Java Graphics2D顏色問題

首先,我將展示兩個比較圖片:

方法1: method 1 http://img713.imageshack.us/img713/3558/tcg6.jpg

方法2: method 2 http://img716.imageshack.us/img716/2755/tcg7.jpg

方法1從來沒有給我帶來任何麻煩,但我最近發現它只是需要很長的時間,方法2解決了這個問題。

代碼方法1:

private void drawDefaultOrientation() { 
    for (int x = 0; x < width; x++) { 
     for (int y = 0; y < height; y++) { 
      int dx = Math.min(x, width - 1 - x); 
      int dy = Math.min(y, height - 1 - y); 
      if (dx < borderSize || dy < borderSize) { 
       inBorder(dx, dy); 
      } 
      else { 
       outBorder(dx, dy); 
      } 
      bufferedImage.setRGB(xOffset + x, yOffset + y, color.getRGB()); 
     } 
    } 
}  

代碼方法2:

private void drawDefaultOrientation() { 
    DataBufferInt buffer = (DataBufferInt)bufferedImage.getRaster().getDataBuffer(); 
    int[] pixelArray = buffer.getData(); 
    for (int x = 0; x < width; x++) { 
     for (int y = 0; y < height; y++) { 
      int dx = Math.min(x, width - 1 - x); 
      int dy = Math.min(y, height - 1 - y); 
      if (dx < borderSize || dy < borderSize) { 
       inBorder(dx, dy); 
      } 
      else { 
       outBorder(dx, dy); 
      } 
      pixelArray[(xOffset + x) + ((yOffset + y) * bufferedImage.getWidth())] = color.getRGB(); 
     } 
    } 
} 

請還注意,inBorder(DX,DY);和outBorder(dx,dy);將顏色變量設置爲具有紅色,綠色,藍色和Alpha值的顏色。

被叫代碼:

new CustomRectangle(bufferedImage, 220, 90, 15, 245, 5, defaultOrientation) { 
     @Override 
     public void inBorder(final int dx, final int dy) { 
      setColor(new Color(red, green, blue, 255 - Math.min(dx, dy))); 
     } 

     @Override 
     public void outBorder(final int dx, final int dy) { 
      setColor(new Color(red, green, blue, 128 - Math.min(dx, dy))); 
     } 
    }.draw(); 

我真的失去了,爲什麼色差是在這裏。

我真的希望有人能幫助我。首先,我認爲這與Alpha值有關,但如所見,α變異仍然存在方法2.

問候。

+0

隨機猜測:不同的顏色空間? http://en.wikipedia.org/wiki/RGB_color_space – 2013-04-08 15:02:05

+0

我可以同意,如果顏色真的非常不同......但我不確定發生了什麼,因爲顏色離彼此不太遠。 – skiwi 2013-04-08 15:05:02

+0

區別主要在於亮度imo。另一個原因可能是扭曲RGB值的附加偏移或壓縮。 'bufferedImage.setRGB(...)'做了什麼? – 2013-04-09 09:43:00

回答

0

我建議,對於「簡單」的事情(包括盒子,形狀,漸變等等),您可以直接使用Java2D API。這將更有效和簡單的寫作。

例如填寫您的圖像的矩形顏色:

public void rectangle(Color color, float x1, float y1, float w, float h) { 
    Graphics2D g = bufferedImage.createGraphics(); 
    g.setColor(color); 
    g.fill(new Rectangle2D.Float(x1, y1, w, h)); 
    g.dispose(); // optional but releases the resource earlier 
} 

您還可以使用「G」吸引儘可能多的事情,你需要做的。