我从相机获得直接流,我需要将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
的原因。
答案 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() );