Im無法獲取像素數據。從字節數組中獲取像素值
我的程序需要屏幕截圖,每個循環都會存儲前一屏幕截圖。
我的目標是在當前屏幕截圖和舊屏幕之間的像素級進行比較。
伊夫運行這段代碼,它告訴我的截圖是什麼格式: 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++;
}
}
我這個代碼的問題是,即使我把純色的截屏,像素值是所有的地方。我希望每個像素具有相同的顏色值。
-Edit-
我爲了性能的原因避免使用getRGB。每次調用getRGB的兩個大圖像迭代在我的應用程序中都是非常昂貴的。
我們不會知道會發生什麼 - 你有一個完整的運行程序,所有的細節你做? – gpasch
首先,「像素」並不是真正的像素值,它是壓縮PNG文件的字節......所以這不會起作用。其次,如果您已經將像素值作爲獨立的R,G和B樣本(您的代碼假定),爲什麼試圖將它們打包成32位ARGB格式並再次打開它們?我首先建議使用'int argb = image.getRGB(x,y);',然後像你已經做的那樣分裂成R,G和B.然後從那裏進行優化,如果速度不夠快... – haraldK
我更新了我的問題。所以字節數組是問題所在?我嘗試使用這個來獲取字節數組最初:'((DataBufferByte)bufferedImage.getData()。getDataBuffer())。getData();'當我嘗試運行它時拋出以下錯誤:'java.lang.ClassCastException :java.awt.image.DataBufferInt不能轉換爲java.awt.image.DataBufferByte',那麼爲像素比較獲取字節數組的方法是什麼? – user3712476