在预览帧中我得到了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);
}
答案 0 :(得分: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;
}
因此,使用中间位图确实可能更快,除非您以后需要单独使用颜色组件。
免责声明:我没有对此进行测试。可以避免一些中间变量,但我想保持这个或多或少的可读性。