2012-01-23 66 views
2

我試圖把圖片作爲輸入,然後操縱所述圖片(我特別想讓它成爲灰度),然後輸出新圖像。這是我正在編輯的代碼的一小部分,但我卻陷入了困境。任何想法,我可以改變/接下來做什麼。不勝感激!以圖片作爲輸入,製作灰度和&然後輸出

public boolean recieveFrame (Image frame) { 
    int width = frame.width(); 
    int height = frame.height(); 

    for (int i = 0; i < width; i++) { 
     for (int j = 0; j < height; j++) { 
      Color c1 = frame.get(i, j); 
      double greyScale = (double) ((Color.red *.3) + (Color.green *.59) + (Color.blue * .11)); 
      Color newGrey = Color.greyScale(greyScale); 
      frame.set(i, j, newGrey); 
     } 
    } 

    boolean shouldStop = displayImage(frame); 
    return shouldStop; 
} 
+0

[如何去飽和圖像](http://stackoverflow.com/questions/6471340/how-do-i-desaturate-a-bufferedimage-in-java/6471524#6471524) – mre

回答

0

我要儘量貼近你已經擁有的東西。因此,我假定您正在尋找如何在Image上進行像素級處理,而不是僅僅尋找適合轉換爲灰度的技術。

第一步是你需要的圖像是一個BufferedImage。這是你在默認情況下從ImageIO得到什麼,但如果你有一些其他類型的圖像,你可以創建一個BufferedImage和第一其它圖像繪製到它:

BufferedImage buffer = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB); 
Graphics2D g = buffer.createGraphics(); 
g.drawImage(image, 0, 0); 
g.dispose() 

然後,您可以像的像素操作這個:

public void makeGrey(BufferedImage image) { 
    for(int x = 0; x < image.getWidth(); ++x) { 
     for(int y = 0; y < image.getHeight(); ++y) { 
     Color c1 = new Color(image.getRGB(x, y)); 
     int grey = (int)(c1.getRed() * 0.3 
         + c1.getGreen() * 0.59 
         + c1.getBlue() * .11 
         + .5); 
     Color newGrey = new Color(grey, grey, grey); 
     image.setRGB(x, y, newGrey.getRGB()); 
     } 
    } 
} 

請注意,這段代碼非常慢。更快的選擇是將BufferedImage中的所有像素提取到int[],對其進行操作,然後將其設置回圖像中。這會使用您在javadoc中找到的其他版本的setRGB()/getRGB()方法。

+0

您可以將浮點數(例如,'灰色=紅色* 30 +綠色* 59 +藍色* 11)/ 100')的點算術。不過不知道這是否能夠提高速度。 –

+0

對於'white',這不會導致> 255的灰色值嗎?這個公式是如何設計的? –

+0

@Andrew:使用我給出的公式,像素顏色(255,255,255)將產生255的灰度值。該公式是基於人類感知靈敏度將顏色轉換爲灰度的流行顏色(30%紅色+ 59%綠色+ 11%藍色)。 –

相關問題