2

埋め込みカメラから解像度 80 x 60 の 16 ビット カラー画像を取得しようとしています (データシートはこちら)。カメラから 9600 (80 * 60 * 16 / 8) バイトを取得できましたが、画像の表示に問題があります。次のコードを使用して、バイト配列をビットマップに変換しています。

bm = Bitmap.createBitmap(80, 60, Bitmap.Config.RGB_565);
bm.copyPixelsFromBuffer(ByteBuffer.wrap(jpegBytes));

jpegBytes は画像のバイトの配列で、長さは 9600 バイトです。

現在、次のような画像を取得しています。

破損した画像

99%の確率で。ただし、次のような破損していない画像を取得できます。

壊れていない画像

めったにありません。なぜこれが起こっているのかについて誰か提案がありますか? 本当にありがとう!

アップデート:

すべてのピクセルが正しい場所にあるように見えますが、RGB 値が混ざっています。たとえば、両方の写真の間の白い部分は同じです。これは、RGB の順序が白になるのに関係がないためです。ただし、破損した画像では赤い椅子が青色に表示され、破損した画像では青いバックパックが緑色に表示されているため、色が混ざっていることは明らかです。

4

2 に答える 2

1

Config.ARGB_8888ビットマップ構成として使用

public static final Bitmap.Config RGB_565のドキュメントから:

各ピクセルは 2 バイトで格納され、RGB チャネルのみがエンコードされます。赤は 5 ビットの精度 (32 の可能な値) で格納され、緑は 6 ビットの精度 (64 の可能な値) で格納され、青は 5 ビットの精度で格納されます。精度。この構成では、ソースの構成によっては、わずかな視覚的アーティファクトが生成される可能性があります。たとえば、ディザリングを行わないと、結果は緑がかった色合いになる場合があります。より良い結果を得るには、ディザリングを適用する必要があります。この構成は、高い色忠実度を必要としない不透明なビットマップを使用する場合に役立ちます。

于 2013-07-23T19:38:32.367 に答える
0

私は同様の問題を抱えていましたが、これが私がそれを解決する方法です:

(1) 受け取ったバイト配列を確認し、ByteBuffer にラップする前に最初に逆にする必要があるかどうかを確認します。

(2) ByteBuffer のエンディアンを確認し、リトル エンディアンに変更する必要があるかどうかを確認します (デフォルトのバイト順はビッグ エンディアンです)。

私の場合、最初にバイト配列を逆にし、ByteBuffer をリトル エンディアンに変更する必要があります。その後、正しい画像を取得できます。

擬似コード:

byte[] imageData ;  (byte array received)
reverseByteArray(imageData);

Bitmap bitmap = Bitmap.createBitmap(imgWidth, imgHeight,Bitmap.Config.RGB_565);

ByteBuffer buffer = ByteBuffer.wrap(imageData);
ByteBuffer newBuffer = ByteBuffer.allocate(buffer.capacity());
newBuffer.order(ByteOrder.LITTLE_ENDIAN);
for (int i = 0; i < buffer.capacity(); i++) {
            byte b = buffer.get(i);
            newBuffer.put(b);
        }
newBuffer.flip();
bitmap.copyPixelsFromBuffer(newBuffer);
setImage(bitmap);

//------
public static void reverseByteArray(byte[] array) {
        if (array == null) {
            return;
        }
        int i = 0;
        int j = array.length - 1;
        byte tmp;
        while (j > i) {
            tmp = array[j];
            array[j] = array[i];
            array[i] = tmp;
            j--;
            i++;
        }
    }
于 2017-08-07T10:10:31.763 に答える