У меня возникли проблемы с получением данных о пикселях.Получение пиксельных значений из байт-массива
Моя программа делает скриншоты, каждый цикл хранит предыдущий снимок экрана.
Моя цель - выполнить сравнение на уровне пикселей между текущим скриншотом и старым.
Ive побежал этот код, который говорит мне, что формат скриншотов в: System.out.println(image.getType());
Выход этого (для моей программы) 1 означает сво BufferedImage.TYPE_INT_RGB
Из того, что Ive читать, типы определите, в каком порядке значения пикселей находятся в массиве байтов.
Я использую этот код, чтобы преобразовать мой Буферизированный изображение в массив байтов (Буферизованные изображение создается с помощью класса 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