Попытка чтения необработанных данных изображения в Java через JNI - PullRequest
0 голосов
/ 19 мая 2009

Я использую JNI для получения необработанных данных изображения в следующем формате:

Данные изображения возвращаются в формате DATA32 (32 бита) на пиксель в линейном массиве, упорядоченном от верхнего левого края изображения до нижнего правого, идущего слева направо в каждой строке. Каждый пиксель имеет верхние 8 бит в качестве альфа-канала, а нижние 8 битов являются синим каналом, поэтому биты пикселя являются ARGB (от самых младших разрядов до 8 бит на канал). Вы должны вернуть данные в какой-то момент.

Формат DATA32 - это, по сути, целое число без знака в 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

1 Ответ

0 голосов
/ 19 мая 2009

Я идиот.

Это просто ошибка.

Я забыл указать выше, как я вычисляю x, y.

В основном я использовал

 int x = i%w;
 int y = i/h;

в цикле for, что неправильно. Должно быть

 int x = i%w;
 int y = i/w;

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

...