2013-08-31 88 views
2

我試圖使用帶有7個參數的BufferedImage.getRGB方法來讀取像素區域並獲取它們的顏色。聽起來很簡單,但由於某種原因,它不適合我。這裏是一個簡短的,自包含的,可編譯例子:java.awt.image.BufferedImage.getRBG不返回期望值

import java.awt.Color; 
import java.awt.Graphics; 
import java.awt.image.BufferedImage; 

import javax.swing.JFrame; 
import javax.swing.JPanel; 

public class BufferedImageTest extends JPanel { 
BufferedImage image; 

public static void main(String[] args) { 
    BufferedImageTest mainClass = new BufferedImageTest(); 
    mainClass.run(); 
} 

private void run() { 
    initWindow(); 
    // Create image: 
    image = new BufferedImage(5, 5, BufferedImage.TYPE_INT_RGB); 
    int[] red = new int[25]; 
    for (int i = 0; i < 25; i++) 
     red[i] = Color.RED.getRGB(); 
    image.setRGB(1, 0, 3, 5, red, 0, 0); 

    // Read image: 
    int[] rgbArray = new int[25]; 
    int w = image.getWidth(); 
    int h = image.getHeight(); 
    image.getRGB(0, 0, w, h, rgbArray, 0, 0); 
    for (int i = 0; i < rgbArray.length; i++) { 
     Color c = new Color(rgbArray[i]); 
     System.out.print("(" + c.getRed() + "," + c.getGreen() + "," + c.getBlue() + ")"); 
     if (i % 5 == 4) 
      System.out.println(""); 
    } 
} 

@Override 
public void paint(Graphics g) { 
    g.drawImage(image, 5, 5, null); 
} 

private void initWindow() { 
    JFrame frame = new JFrame(); 
    frame.getContentPane().add(this); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.setSize(40, 60); 
    frame.setVisible(true); 
} 
} 

的run()方法我第一次創建這樣一個非常簡單的5×5像素圖像:

example image

那去精細。然後我嘗試讀取該圖像的像素,而這幾乎根本不起作用。它只能正確獲取第一行像素,然後將剩下的顯示爲黑色。打印循環的輸出是:

(0,0,0)(255,0,0)(255,0,0)(255,0,0)(0,0,0) 
(0,0,0)(0,0,0)(0,0,0)(0,0,0)(0,0,0) 
(0,0,0)(0,0,0)(0,0,0)(0,0,0)(0,0,0) 
(0,0,0)(0,0,0)(0,0,0)(0,0,0)(0,0,0) 
(0,0,0)(0,0,0)(0,0,0)(0,0,0)(0,0,0) 

當我期望它完全像第一行時。我在這裏錯過了什麼?我嘗試過從零開始編寫它,並在getRGB調用中使用「scanline」和「offset」參數進行播放,但似乎沒有任何效果。我在Windows 7上運行Java 7,如果這有什麼區別的話。

回答

3

指定正確的掃描尺寸讓所有的線路:

image.getRGB(0, 0, w, h, rgbArray, 0, w); 

看吧:BufferedImage#setRGB()BufferedImage#getRGB()

+0

嗯,這似乎這樣的伎倆。謝謝!雖然我仍然不明白爲什麼設置scansize除了_h_會讓我看到那些瘋狂的值爲什麼我的setRGB調用在scansize爲0時工作得很好?問題一定是我仍然不知道「掃描線跨越rgbArray」的實際含義,因爲這是變量在文檔中定義的方式。 – ZeroOne

+0

@ZeroOne儘管答案適用於5x5示例,但您通常希望將scanSize或scanline跨度設置爲「w」(而不是「h」)。此參數的原因是允許將像素區域複製到可能的更大像素陣列中(作爲示例)。 – haraldK

+0

@haraldK,謝謝。更正 – Jk1