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像素图像:
那去精细。然后我尝试读取该图像的像素,而这几乎根本不起作用。它只能正确获取第一行像素,然后将剩下的显示为黑色。打印循环的输出是:
(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,如果这有什么区别的话。
嗯,这似乎这样的伎俩。谢谢!虽然我仍然不明白为什么设置scansize除了_h_会让我看到那些疯狂的值为什么我的setRGB调用在scansize为0时工作得很好?问题一定是我仍然不知道“扫描线跨越rgbArray”的实际含义,因为这是变量在文档中定义的方式。 – ZeroOne
@ZeroOne尽管答案适用于5x5示例,但您通常希望将scanSize或scanline跨度设置为“w”(而不是“h”)。此参数的原因是允许将像素区域复制到可能的更大像素阵列中(作为示例)。 – haraldK
@haraldK,谢谢。更正 – Jk1