【问题标题】:onpreviewframe byte[] to int[]onpreviewframe byte[] 到 int[]
【发布时间】:2012-06-17 17:38:12
【问题描述】:

在预览帧中,我得到 ImageFormat.RGB_565 中的字节 []。 现在我想将此 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);
}

【问题讨论】:

  • 这似乎是合理的。您可以尝试手动逐像素转换,但可能不会更快。

标签: java android


【解决方案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;
} 

因此,使用中间位图确实可能更快,除非您以后需要单独的颜色组件。

免责声明:我没有对此进行测试。可以避免一些中间变量,但我想保持这种或多或少的可读性。

【讨论】:

  • 有趣的是他的方法要慢得多。也许在 NDK 中这样做会有所帮助...打算尝试一下
  • 如果您尝试在 android 中进行图像处理,NDK 会快得多。尝试通过this tutorial。它真的帮助我完成了一个项目。
  • @StefanHaustein 使用您在 java 中的方法大约为 10FPS,而使用位图方法为 25FPS。无论如何,我现在只是默认通过 JNI 将 YUV 转换为 RGB555,即使手机支持 RGB565 并获得超过 25FPS
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-08-06
  • 2010-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多