Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/180.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java onpreviewframe字节[]到int[]_Java_Android - Fatal编程技术网

Java onpreviewframe字节[]到int[]

Java onpreviewframe字节[]到int[],java,android,Java,Android,在预览帧中,我得到ImageFormat.RGB_565中的字节[]。 现在我想把这个字节[]转换成int[],这样我就可以做一些像素操作了 我怎么能这么做 注:到目前为止,我是这样做的,但似乎没有得到优化: public void onPreviewFrame(byte[] data, Camera camera) { ... ByteBuffer bf = ByteBuffer.wrap(data); mBitmap = Bitmap.createBitmap(mW

在预览帧中,我得到ImageFormat.RGB_565中的字节[]。 现在我想把这个字节[]转换成int[],这样我就可以做一些像素操作了

我怎么能这么做

注:到目前为止,我是这样做的,但似乎没有得到优化:

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);
}

我认为手动执行此操作的代码大致如下所示:

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;
} 
for(int i=0;i5)和0x3f;
int r5=(rgb565>>11)和0x1f;
//将组件缩放至8位:
//向左移位并用最高位填充末尾的空位,
//所以00000扩展到000000000,但11111扩展到11111111
int b=(b5>2);
int g=(g6>4);
int r=(r5>2);
//rgb888值,存储在数组或缓冲区中。。。

整数rgb=(r这似乎是合理的。你可以尝试逐像素手动转换,但速度可能不会更快。有趣的是,他的方法要慢得多。也许在NDK中进行转换会有帮助……尝试一下如果你尝试在android中进行图像处理,NDK会快得多。尝试一下。这确实对我的项目有帮助。@StefanHaust在java中,ein大约是10FPS,而在位图方法中是25FPS。不管怎样,我现在只是默认通过JNI将YUV转换为RGB555,即使手机支持RGB565并获得超过25FPS