尝试通过JNI将原始图像数据读入Java

时间:2009-05-18 23:30:21

标签: java-native-interface bufferedimage

我正在使用JNI以下列格式获取原始图像数据:

图像数据以每个像素的DATA32(32位)格式返回,以线性阵列从图像的左上方排序到右下方,每行从左到右。每个像素的高8位作为alpha通道,低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颜色分量打包为整数像素的图像。该图像具有带alpha的DirectColorModel。该图像中的颜色数据被认为不与alpha预乘。当此类型用作BufferedImage构造函数的imageType参数时,创建的图像与在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 :(得分:0)

我是个白痴。

这只是一个错误。

我忘了包括如何计算上面的x,y。

基本上我正在使用

 int x = i%w;
 int y = i/h;
在for循环中

,这是错误的。应该是

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

无法相信我犯了这个愚蠢的错误。