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に割り当てられ、それぞれに同じ値が割り当てられ、さらにアルファが1に設定されます。

于 2013-01-20T09:20:30.137 に答える
0

createBitmap docsによると、その int 配列は、「(alpha << 24) | (red << 16) | (green << 8) | blue」であるColorの配列として解釈されます。そのため、これらのバイトをロードして int 配列にデータを入力するとき、現在、アルファ スロットではなく青いスロットにデータを配置しています。そのため、アルファ値はすべてゼロであり、実際にはクリアなテクスチャになると期待しています. 私はあなたが望むと信じています

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