gpt4 book ai didi

java - 如何从 Android MediaImage 以 OUTPUT_IMAGE_FORMAT_RGBA_8888 格式创建位图?

转载 作者:行者123 更新时间:2023-12-05 01:06:29 28 4
gpt4 key购买 nike

我正在尝试使用 CameraX 图像分析(版本 1.1.0-alpha08)的这一新功能:使用 setOutputImageFormat(ImageAnalysis.OUTPUT_IMAGE_FORMAT_RGBA_8888),发送到分析仪的图像将具有 RGBA 格式。

引用:https://developer.android.com/reference/androidx/camera/core/ImageAnalysis#OUTPUT_IMAGE_FORMAT_RGBA_8888

我需要将发送到分析器的图像转换为位图,以便将其输入到 TensorFlow 分类器。如果没有这个新功能,我将收到标准 YUV_420_888 格式的图像,然后我必须使用可以通过谷歌搜索的几种解决方案之一,以便将 YUV_420_888 转换为 RGBA,然后转换为位图。像这样:https://blog.minhazav.dev/how-to-convert-yuv-420-sp-android.media.Image-to-Bitmap-or-jpeg/ .我认为直接以​​ RGBA 格式获取媒体图像应该可以帮助我避免实现那些痛苦的解决方案(我实际上已经尝试过,到目前为止似乎对我来说效果不佳)。

问题是我不知道如何将此 RGBA 媒体图像转换为位图。我注意到调用 mediaImage.getFormat() 返回 1 这不是 ImageFormat 值而是 PixelFormat 一个,逻辑上对应于 RGBA_8888 格式,这与文档一致:“所有 ImageProxy 发送到 ImageAnalysis.Analyzer.analyze( ImageProxy) 的格式为 PixelFormat.RGBA_8888"。

我试过这个:

private Bitmap toBitmapRGBA(Image image) {
Image.Plane[] planes = image.getPlanes();
ByteBuffer buffer = planes[0].getBuffer();
buffer.rewind();
int size = buffer.remaining();
byte[] bytes = new byte[size];
buffer.get(bytes);
Bitmap bitmapImage = BitmapFactory.decodeByteArray(bytes, 0, bytes.length, null);
return bitmapImage;
}

这返回 null 表示 decodeByteArray 不起作用。 (我注意到图像只有一架飞机)。

private Bitmap toBitmapRGBA2(Image image) {
Image.Plane[] planes = image.getPlanes();
ByteBuffer buffer = planes[0].getBuffer();
Bitmap bitmap = Bitmap.createBitmap(image.getWidth(), image.getHeight(), Bitmap.Config.ARGB_8888);
buffer.rewind();
bitmap.copyPixelsFromBuffer(buffer);
return bitmap;
}

这会返回一个看起来值得注意但有噪音的位图。

请帮忙!亲切的问候迈克尔

最佳答案

其实我自己也找到了解决办法,有兴趣的我贴在这里:

private Bitmap toBitmap(Image image) {
Image.Plane[] planes = image.getPlanes();
ByteBuffer buffer = planes[0].getBuffer();
int pixelStride = planes[0].getPixelStride();
int rowStride = planes[0].getRowStride();
int rowPadding = rowStride - pixelStride * image.getWidth();
Bitmap bitmap = Bitmap.createBitmap(image.getWidth()+rowPadding/pixelStride,
image.getHeight(), Bitmap.Config.ARGB_8888);
bitmap.copyPixelsFromBuffer(buffer);
return bitmap;
}

关于java - 如何从 Android MediaImage 以 OUTPUT_IMAGE_FORMAT_RGBA_8888 格式创建位图?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69151779/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com