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

时间:2017-01-21 05:12:38

标签: android image

在android中,我从这里获得了一个Image对象https://inducesmile.com/android/android-camera2-api-example-tutorial/这个相机教程。但是我现在想要循环显示像素值,是否有人知道我该怎么做?我是否需要将其转换为其他内容,我该怎么做?

由于

5 个答案:

答案 0 :(得分:11)

如果要在整个像素中循环所有,则需要先将其转换为Bitmap对象。现在,因为我在源代码中看到它返回Image,你可以直接将字节转换为位图。

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

然后,一旦获得位图对象,您现在可以遍历所有像素。

答案 1 :(得分:1)

YuvToRgbConverter对于从图像到位图的转换很有用。

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

使用示例。

   val bmp = Bitmap.createBitmap(image.width, image.height, Bitmap.Config.ARGB_8888)
   yuvToRgbConverter.yuvToRgb(image, bmp)

答案 2 :(得分:0)

https://docs.oracle.com/javase/1.5.0/docs/api/java/nio/ByteBuffer.html#get%28byte[]%29

根据java文档:buffer.get方法将字节从此缓冲区传输到给定的目标数组。调用src.get(a)形式的此方法的行为与调用的方式完全相同

I'm selecting package installer for installing the application. But, it is poping  "There was a problem while parsing the package".
How to resolve this error.

Thanks & Regards,
Gowtham M

答案 3 :(得分:0)

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

第一个很简单。请注意,您从相机获得的Image对象只是一个YUV帧,其中Y和U + V分量位于不同的平面中。在许多图像处理情况下,您仅需要Y平面,即图像的灰色部分。为了得到它,我建议这样的代码:

    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)打开该框架以检查格式。

第二个问题要复杂一些。 为了获得位图对象,我从TensorFlow项目here中找到了一些代码示例。对您而言,最有趣的功能是“ convertImageToBitmap”,它将为您返回RGB值。

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

  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帧的选项,因此,如果需要像素值,则位图不是最佳选择,因为它可能会消耗比您需要的更多的内存,仅获取RGB值

答案 4 :(得分:0)

1-将图像文件的路径存储为字符串变量。要解码图像文件的内容,您需要将文件路径存储为字符串。使用以下语法作为指导:

String picPath = "/mnt/sdcard/Pictures/mypic.jpg";

2-创建一个位图对象并使用BitmapFactory:

Bitmap picBitmap;
Bitmap picBitmap = BitmapFactory.decodeFile(picPath);