2

プレビューフレームで、ImageFormat.RGB_565のbyte[]を取得します。次に、このbyte[]をint[]に変換して、ピクセル操作を実行できるようにします。

どうすればそれができますか?

ps。これまでのところ、私はこのようにしていますが、非常に最適化されていないようです。

public void onPreviewFrame(byte[] data, Camera camera) { ...
    ByteBuffer bf = ByteBuffer.wrap(data);

        mBitmap = Bitmap.createBitmap(mWidth, mHeight, Bitmap.Config.RGB_565);
        mBitmap.copyPixelsFromBuffer(bf);

次に、これを実行して、int []のピクセルを取得します:

        int bitmapArray[] = new int[originalWidth * originalHeight];

    mBitmap.getPixels(bitmapArray, 0, originalWidth, 0, 0,
            originalWidth, originalHeight);
}
4

1 に答える 1

1

これを手動で行うコードは、おおよそ次のようになります。

for (int i = 0; i < data.length; i += 2) {
  // Reconstruct 16 bit rgb565 value from two bytes
  int rgb565 = (data[i] & 255) | ((data[i + 1] & 255) << 8);

  // Extract raw component values (range 0..31 for g and b, 0..63 for g)  
  int b5 = rgb565 & 0x1f;
  int g6 = (rgb565 >> 5) & 0x3f;
  int r5 = (rgb565 >> 11) & 0x1f;

  // Scale components up to 8 bit: 
  // Shift left and fill empty bits at the end with the highest bits,
  // so 00000 is extended to 000000000 but 11111 is extended to 11111111
  int b = (b5 << 3) | (b5 >> 2);
  int g = (g6 << 2) | (g6 >> 4);
  int r = (r5 << 3) | (r5 >> 2); 

  // The rgb888 value, store in an array or buffer...
  int rgb = (r << 16) | (g << 8) | b;
} 

したがって、後でカラーコンポーネントを個別に必要としない限り、中間ビットマップを使用すると実際に高速になる可能性があります。

免責事項:私はこれをテストしませんでした。いくつかの中間変数は避けることができますが、私はこれを多かれ少なかれ読みやすくしたかったのです。

于 2012-06-17T22:20:41.430 に答える