Попытка считывания необработанных данных изображения в Java через JNI
-
22-08-2019 - |
Вопрос
Я использую JNI для получения необработанных данных изображения в следующем формате:
Данные изображения возвращаются в формате DATA32 (32 бита) на пиксель в линейном массиве, упорядоченном от верхнего левого края изображения до нижнего правого, идущего слева направо по каждой строке.Каждый пиксель имеет верхние 8 бит в качестве альфа-канала, а нижние 8 бит являются синим каналом - таким образом, биты пикселя равны ARGB (от наибольшего до наименьшего значения, по 8 бит на канал).В какой-то момент вы должны вернуть данные обратно.
Формат DATA32 по сути представляет собой unsigned int в C.
Итак, я получаю массив int[], а затем пытаюсь создать из него Буферизованное изображение с помощью
int w = 1920;
int h = 1200;
BufferedImage b = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB);
int[] f = (new Capture()).capture();
for(int i = 0; i < f.length; i++){;
b.setRGB(x, y, f[i]);
}
f - это массив с пиксельными данными.
Согласно документации Java, это должно сработать, поскольку BufferedImage.TYPE_INT_ARGB равен:
Представляет изображение с 8-битными цветовыми компонентами RGBA, упакованными в целочисленные пиксели.Изображение имеет DirectColorModel с альфа-символом.Считается, что цветовые данные на этом изображении не были предварительно умножены на альфа.Когда этот тип используется в качестве аргумента ImageType конструктора BufferedImage, созданное изображение согласуется с изображениями, созданными в JDK1.1 и более ранних версиях.
Если только под 8-битным RGBA они не подразумевают, что все компоненты, добавленные вместе, кодируются в 8 битах?Но это невозможно.
Этот код действительно работает, но создаваемое изображение совсем не похоже на то, которое оно должно создавать.Здесь тонны артефактов.Кто-нибудь может увидеть здесь что-то явно неправильное?
Примечание. Я получаю свои пиксельные данные с помощью
imlib_context_set_image(im);
data = imlib_image_get_data();
в моем коде на C, использующем библиотеку imlib2 с api http://docs.enlightenment.org/api/imlib2/html/imlib2_8c.html#17817446139a645cc017e9f79124e5a2
Решение
я идиот.
Это всего лишь ошибка.
Я забыл указать, как я вычисляю x, y выше.
В основном я использовал
int x = i%w;
int y = i/h;
в цикле for, что неверно.Должно быть
int x = i%w;
int y = i/w;
Не могу поверить, что я совершил эту глупую ошибку.