在android中,我从这里获取了一个图像对象https://inducesmile.com/android/android-camera2-api-example-tutorial/这个相机教程。但是我现在想遍历像素值,有人知道我怎么做吗?我需要把它转换成其他东西吗?我该怎么做?
谢谢
发布于 2017-01-21 13:37:53
如果你想循环遍历整个像素,那么你需要首先把它转换成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);
一旦你得到了位图对象,你就可以遍历所有的像素。
发布于 2020-07-30 14:10:44
YuvToRgbConverter对于从图像转换为位图非常有用。
用法示例。
val bmp = Bitmap.createBitmap(image.width, image.height, Bitmap.Config.ARGB_8888)
yuvToRgbConverter.yuvToRgb(image, bmp)
发布于 2019-09-08 20:42:36
实际上你有两个问题1)如何循环抛出android.media.Image像素2)如何将android.media.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)打开它以检查格式。
第二个问题有点复杂。为了获得Bitmap对象,我从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帧,所以如果你需要像素值,也许Bitmap不是最好的选择,因为它可能会消耗比你需要的更多的内存,只获得RGB值
https://stackoverflow.com/questions/41775968
复制相似问题