android - 如何使用 ByteBuffer 在 native 内存中保存位图图像并恢复它

标签 android bytebuffer

我正在从相机获取直接流,我需要将 Bitmap 保存到 ByteBuffer 中并恢复它。这是我的代码:

YuvImage yuv = new YuvImage(data.getExtractImageData(), previewFormat, width, height, null);

    ByteArrayOutputStream out = new ByteArrayOutputStream();
    yuv.compressToJpeg(new Rect(0, 0, width, height), 50, out);

    byte[] bytes = out.toByteArray();

    Bitmap image = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);

    Bitmap imageResult = RotateImage(image, 4 - rotation);
    imageResult = cropBitmap(imageResult, data.getRect());

    int nBytes = imageResult.getByteCount();
    ByteBuffer buffer = ByteBuffer.allocateDirect(nBytes);
    imageResult.copyPixelsToBuffer(buffer);

    return buffer.array();

byte[] 转换回 Bitmap 的代码:

Bitmap bitmap = BitmapFactory.decodeByteArray(images.getImage(), 0, images.getImage().length);

但是,bitmap 转换后为 Null...

知道哪里出了问题吗?

澄清一下:我需要将 byte[] 图像 保存在 native 内存中,这就是我执行 ByteBuffer.allocateDirect 的原因。我需要在特定点裁剪图像,这就是为什么我需要 bitmap

最佳答案

decodeByteArray()解码存储在字节数组中的压缩图像(例如 JPEG 或 PNG)。然而copyPixelsToBuffer()将 Bitmap 的内容“按原样”(即未压缩)复制到字节缓冲区中,因此它不能被 decodeByteArray() 解码。

如果您不想重新编码您的位图,您可以像现在一样使用 copyPixelsToBuffer(),并将您的第二个代码块更改为使用 copyPixelsFromBuffer()而不是 decodeByteArray()。

Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
bitmap.copyPixelsFromBuffer(ByteBuffer.wrap(images.getImage()));

您需要保存宽度和高度。还要确保 Bitmap.Config 相同。

基本上,如果您将其保存为压缩文件,则必须将其加载为压缩文件,如果您将其未压缩文件保存,则必须将其未压缩文件加载。

关于android - 如何使用 ByteBuffer 在 native 内存中保存位图图像并恢复它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28959280/

相关文章:

java - 如何复制 ByteBuffer 的内容?

安卓 WebView :How to display only part of webpage

java - 如何从 ByteBuffer 中读取数据

android - 将控件动态添加到 tabhost 时出现问题

java - Android Studio - 将目标兼容性设置为 JDK 1.8 后 Gradle 构建失败

java - 将 ByteBuffer 传递给 jni,以便 C 代码在其内存地址中执行写操作

java - ReadableByteChannel.read(ByteBuffer dest) 读取上限为 8KB。为什么?

java - 在 Java 中快速删除(不清除)一个 ByteBuffer

android - 在开始一个新的 Intent Activity 后使用 Toast

java - 在我的 Android 应用程序中获取灰色方 block 而不是 Google map