【发布时间】:2016-11-15 22:09:54
【问题描述】:
我无法获取像素数据。
我的程序截取屏幕截图,每个循环它都会存储之前的屏幕截图。
我的目标是在当前屏幕截图和旧屏幕截图之间进行像素级别的比较。
我运行了这段代码,它告诉我屏幕截图的格式:
System.out.println(image.getType());
这个(对于我的程序)的输出是 1 表示它是 BufferedImage.TYPE_INT_RGB
根据我读取的内容,类型决定了像素值在字节数组中的顺序。
我正在使用此代码将我的缓冲图像转换为字节数组(缓冲图像是使用 awt.Robot 类创建的):
public byte[] convertToByteArray(BufferedImage img){
byte[] imageInByte = null;
try {
// convert BufferedImage to byte array
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ImageIO.write(img, "png", baos);
baos.flush();
imageInByte = baos.toByteArray();
baos.close();
} catch (IOException ex) {
Logger.getLogger(OverlayWindow.class.getName()).log(Level.SEVERE, null, ex);
}
return imageInByte;
}
最后我使用比较方法来检查字节数组。现在只打印数组的颜色值:
final byte[] pixels = convertToByteArray(image);
final int pixelLength = 3;
for (int pixel = 0, row = 0, col = 0; pixel < 1; pixel += pixelLength) {
int argb = 0;
argb += -16777216; // 255 alpha
argb += ((int) pixels[pixel] & 0xff); // blue
argb += (((int) pixels[pixel + 1] & 0xff) << 8); // green
argb += (((int) pixels[pixel + 2] & 0xff) << 16); // red
int r = (argb >> 16) & 0xff, g = (argb >> 8)& 0xff, b = argb & 0xff;
System.out.println("R = " + r);
System.out.println("G = " + g);
System.out.println("B = " + b);
col++;
if (col == width) {
col = 0;
row++;
}
}
我对这段代码的问题是,即使我截取了纯色的屏幕截图,像素值也到处都是。我希望每个像素都具有相同的颜色值。
-编辑-
出于性能原因,我避免使用 getRGB。在我的应用程序中,每次调用 getRGB 遍历两个大图像非常昂贵。
【问题讨论】:
-
我们不知道会发生什么 - 你有一个完整的运行程序,包含你所做的所有细节吗??
-
首先,
pixels不是真正的像素值,它是压缩的 PNG 文件的字节......所以无论如何这都行不通。其次,如果您已经将像素值作为单独的 R、G 和 B 样本(您的代码假定),为什么要尝试将它们打包成 32 位 ARGB 格式并再次解包?我建议首先使用int argb = image.getRGB(x, y);,然后像你已经做的那样分成R、G和B。然后从那里优化,如果它不够快...... -
我更新了我的问题。那么字节数组有问题吗?我最初尝试使用它来获取字节数组:
((DataBufferByte) bufferedImage.getData().getDataBuffer()).getData();当我尝试运行它时会引发以下错误:java.lang.ClassCastException: java.awt.image.DataBufferInt cannot be cast to java.awt.image.DataBufferByte那么获取字节数组以进行像素比较的正确方法是什么?
标签: java arrays image-processing bufferedimage