gpt4 book ai didi

java - Android:我们真的可以保存 ImageReader 的 acquireLatestImage() 吗?

转载 作者:行者123 更新时间:2023-11-30 05:04:26 44 4
gpt4 key购买 nike

我目前正在使用 Camera2 API,并创建了一个新的 ImageReader.OnImageAvailableListener 对象。当然,它必须实现 onImageAvailable(ImageReader reader) 方法。我唯一想要的,就是从这个读者那里获取最新的图像,并保存它,但不幸的是,我就是无法获取它。看了很多源码,访问了不同的StackOverflow topcis,都没有找到答案。我现在正处于那个时候,当我不得不问:这个 Image 对象真的可以作为图像文件保存到手机的存储空间中吗?方法如下:

@Override
public void onImageAvailable(ImageReader reader) {

Image image = reader.acquireLatestImage();

ByteBuffer buffer = image.getPlanes()[0].getBuffer();
buffer.rewind();
byte[] bytes = new byte[buffer.capacity()];
buffer.get(bytes);

save(bytes);

image.close();

}

save() 方法仅打开一个 FileOutputStream 并将字节写入其中,它正在运行。问题是,我只得到一张黑色图像,而且它的尺寸非常小。

图像的格式是 JPEG,这是我之前配置 ImageReader 实例的方式。

我什至尝试将其转换为不同的格式,例如从 NV21JPEG 等等,但没有成功。我在这里缺少什么?

最佳答案

这是我用来从 Image 中提取 Bitmap 的类。

import android.graphics.Bitmap
import android.graphics.BitmapFactory
import android.media.Image
import java.io.IOException
import java.io.InputStream
import java.nio.ByteBuffer
import kotlin.experimental.and

class ImagePreprocessor {
private var rgbFrameBitmap = Bitmap.createBitmap(IMAGE_WIDTH, IMAGE_HEIGHT,
Bitmap.Config.ARGB_8888)

fun preprocessImage(image: Image?): Bitmap? {
if (image == null) {
return null
}

check(rgbFrameBitmap!!.width == image.width, { "Invalid size width" })
check(rgbFrameBitmap!!.height == image.height, { "Invalid size height" })

if (rgbFrameBitmap != null) {
val bb = image.planes[0].buffer
rgbFrameBitmap = BitmapFactory.decodeStream(ByteBufferBackedInputStream(bb))
}

return rgbFrameBitmap
}

private class ByteBufferBackedInputStream(internal var buf: ByteBuffer) : InputStream() {

@Throws(IOException::class)
override fun read(): Int {
return if (!buf.hasRemaining()) {
-1
} else (buf.get() and 0xFF.toByte()).toInt()
}

@Throws(IOException::class)
override fun read(bytes: ByteArray, off: Int, len: Int): Int {
var len = len
if (!buf.hasRemaining()) {
return -1
}

len = Math.min(len, buf.remaining())
buf.get(bytes, off, len)
return len
}
}
}

我用它直接在 ImageView 上设置位图,但应该可以在 Bitmap 上使用 compress 方法将其保存到文件。请注意,这仅适用于 JPEG,因为数据位于单个平面中。

关于java - Android:我们真的可以保存 ImageReader 的 acquireLatestImage() 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54813010/

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