首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何将android.media.Image转换为位图对象?

如何将android.media.Image转换为位图对象?
EN

Stack Overflow用户
提问于 2017-01-21 13:12:38
回答 6查看 39.8K关注 0票数 28

在android中,我从这里获取了一个图像对象https://inducesmile.com/android/android-camera2-api-example-tutorial/这个相机教程。但是我现在想遍历像素值,有人知道我怎么做吗?我需要把它转换成其他东西吗?我该怎么做?

谢谢

EN

回答 6

Stack Overflow用户

发布于 2017-01-21 13:37:53

如果你想循环遍历整个像素,那么你需要首先把它转换成Bitmap对象。现在,因为我在源代码中看到它返回一个Image,所以您可以直接将字节转换为位图。

代码语言:javascript
复制
    Image image = reader.acquireLatestImage();
    ByteBuffer buffer = image.getPlanes()[0].getBuffer();
    byte[] bytes = new byte[buffer.capacity()];
    buffer.get(bytes);
    Bitmap bitmapImage = BitmapFactory.decodeByteArray(bytes, 0, bytes.length, null);

一旦你得到了位图对象,你就可以遍历所有的像素。

票数 34
EN

Stack Overflow用户

发布于 2020-07-30 14:10:44

YuvToRgbConverter对于从图像转换为位图非常有用。

https://github.com/android/camera-samples/blob/master/Camera2Basic/utils/src/main/java/com/example/android/camera/utils/YuvToRgbConverter.kt

用法示例。

代码语言:javascript
复制
   val bmp = Bitmap.createBitmap(image.width, image.height, Bitmap.Config.ARGB_8888)
   yuvToRgbConverter.yuvToRgb(image, bmp)
票数 2
EN

Stack Overflow用户

发布于 2019-09-08 20:42:36

实际上你有两个问题1)如何循环抛出android.media.Image像素2)如何将android.media.image转换为位图

第一步很简单。请注意,您从相机获得的图像对象,它只是一个YUV帧,其中Y和U+V分量位于不同的平面上。在许多图像处理案例中,您只需要Y平面,这意味着图像的灰色部分。为了获得它,我建议使用如下代码:

代码语言:javascript
复制
    Image.Plane[] planes = image.getPlanes();
    int yRowStride = planes[0].getRowStride();
    byte[] yImage = new byte[yRowStride];
    planes[0].getBuffer().get(yImage);

yImage字节缓冲区实际上是帧的灰度像素。使用相同的方式,您可以将U+V部件放入。请注意,它们可以是先是U,然后是V,或者是V,然后是U,并且可能是共存的(这是Camera2 API的常见情况)。所以你得到了UVUV...

出于调试目的,我经常将帧写入一个文件,并尝试使用Vooya应用程序(Linux)打开它以检查格式。

第二个问题有点复杂。为了获得Bitmap对象,我从TensorFlow项目here中找到了一些代码示例。对您来说最有趣的函数是"convertImageToBitmap“,它将返回RGB值。

要将它们转换为真实的位图,请执行以下操作:

代码语言:javascript
复制
  Bitmap rgbFrameBitmap;
  int[] cachedRgbBytes;
  cachedRgbBytes = ImageUtils.convertImageToBitmap(image, cachedRgbBytes, cachedYuvBytes);
  rgbFrameBitmap = Bitmap.createBitmap(image.getWidth(), image.getHeight(), Bitmap.Config.ARGB_8888);
  rgbFrameBitmap.setPixels(cachedRgbBytes,0,image.getWidth(), 0, 0,image.getWidth(), image.getHeight());

注意:有更多的选项可以将YUV转换为RGB帧,所以如果你需要像素值,也许Bitmap不是最好的选择,因为它可能会消耗比你需要的更多的内存,只获得RGB值

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41775968

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档