如何使用ByteBuffer在本机内存中保存位图图像并将其恢复

时间:2015-03-10 08:43:20

标签: 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为空......

对于什么是错误的任何想法?

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

2 个答案:

答案 0 :(得分:1)

decodeByteArray()解码存储在字节数组中的压缩图像(例如JPEG或PNG)。但是copyPixelsToBuffer()将“位图”的内容“按原样”复制到字节缓冲区(即未压缩),因此无法通过decodeByteArray()对其进行解码。

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

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

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

基本上,如果你保存压缩然后你必须加载它压缩,如果你保存它未压缩,那么你必须加载它未压缩。

答案 1 :(得分:0)

在分配缓冲区时,还应该设置字节顺序,因为Java是big endian,因此默认情况下,缓冲区是big endian,android是little endian,底层的cpu体系结构可以变化,但是大多数都是little endian wrt android:< / p>

buffer.order( ByteOrder.nativeOrder() );