2

我想以二进制格式(无符号字节)从磁盘读取单色图像数据,并将其显示为 Android 中的 OpenGL ES 2 纹理。我目前正在使用 Eclipse 和 AVD 模拟器。

我可以使用 InputStream 从磁盘读取数据,然后将字节数据转换为 int 以允许我使用 createBitmap 方法。

我希望通过使用 ALPHA_8 作为位图格式来创建单色位图,但如果我这样做,纹理在渲染时会显示为纯黑色。如果我将位图格式更改为 RGB_565,我可以看到图像的某些部分,但当然颜色都是乱码,因为它是错误的数据格式。

我尝试向 texImage2D() 添加额外参数以尝试强制纹理格式和源数据类型,但如果我在 texImage2D 参数中使用任何 opengl 纹理格式代码,Eclipse 会显示错误。

我不知所措,谁能告诉我如何编辑它以将单色纹理导入 OpenGL ES?

    int w = 640;
    int h = 512;
    int nP = w * h; //no. of pixels

    //load the binary data
    byte[] byteArray = new byte[nP];
    try {
        InputStream fis = mContext.getResources()
                .openRawResource(R.raw.testimage); //testimage is a binary file of U8 image data
        fis.read(byteArray);
        fis.close();
    } catch(IOException e) {
            // Ignore.
    }

    System.out.println(byteArray[1]);

    //convert byte to int to work with createBitmap (is there a better way to do this?)
    int[] intArray = new int[nP];
    for (int i=0; i < nP; i++)
    {
        intArray[i] = byteArray[i];
    }

    //create bitmap from intArray and send to texture
    Bitmap img = Bitmap.createBitmap(intArray, w, h, Bitmap.Config.ALPHA_8);
    GLUtils.texImage2D(GLES20.GL_TEXTURE_2D, 0, img, 0);
    img.recycle();
    //as the code is the image is black, if I change ALPHA_8 to RGB_565 then I see a corrupted image

谢谢你的帮助,

卢克

4

2 回答 2

1

加载Bitmap到字节数组后,您也可以glTexImage2D直接与字节数组一起使用。这将是一些类似的东西;

byte data[bitmapLength] = your_byte_data;
ByteBuffer buffer = ByteBuffer.allocateDirect(bitmapLength);
buffer.put(data);
buffer.position(0);

GLES20.glTexImage2D(GLES20.GL_TEXTURE_2D, 0, GLES20.GL_LUMINANCE,
                    bitmapWidth, bitmapHeight, 0, GLES20.GL_LUMINANCE,
                    GLES20.GL_UNSIGNED_BYTE, buffer);

这应该将每个字节值分配给 RGB,每个字节值相同,加上 alpha 设置为 1。

于 2013-01-20T09:20:30.137 回答
0

根据createBitmap 文档,该 int 数组被解释为Color数组,即“(alpha << 24) | (red << 16) | (green << 8) | blue”。因此,当您加载这些字节并填充您的 int 数组时,您当前将数据放在蓝色插槽而不是 alpha 插槽中。因此,您的 alpha 值都为零,我实际上希望这会产生清晰的纹理。我相信你想要

intArray[i] = byteArray[i] << 24;
于 2013-01-20T00:30:29.500 回答