在android中,我从这里获得了一个Image对象https://inducesmile.com/android/android-camera2-api-example-tutorial/这个相机教程。但是我现在想要循环显示像素值,是否有人知道我该怎么做?我是否需要将其转换为其他内容,我该怎么做?
由于
答案 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对于从图像到位图的转换很有用。
使用示例。
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);