代码之家  ›  专栏  ›  技术社区  ›  ldog

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

  •  0
  • ldog  · 技术社区  · 17 年前

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

    图像数据以每像素32(32位)的数据格式返回,该数据以线性数组的形式排列,从图像的左上角到右下角,从左到右每行排列一次。每个像素的上8位是alpha通道,下8位是蓝色通道,因此像素的位是argb(从最高到最低有效,每个通道8位)。您必须在某个时刻将数据放回原处。

    data32格式本质上是c中的无符号int。

    所以我得到了一个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文档,这应该工作,因为BuffeReDiga.Type

    表示一个图像,其中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 回复  |  直到 17 年前
        1
  •  0
  •   ldog    17 年前

    我是个白痴。

    这只是一只虫子。

    我忘了把上面计算x,y的方法包括在内。

    基本上我用的是

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

    在for循环中,这是错误的。应该是

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

    真不敢相信我犯了这个愚蠢的错误。

    推荐文章