Попытка считывания необработанных данных изображения в Java через JNI

StackOverflow https://stackoverflow.com/questions/880291

Вопрос

Я использую 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;

Не могу поверить, что я совершил эту глупую ошибку.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top