将位图转换为字节数组,转换为字符串,然后一直返回

时间:2013-12-16 21:29:51

标签: java android string bitmap bytearray

我尝试了java文档中的几种不同方法,以及其他SO问题的几种解决方案,并成功获得了Bitmap转换为byte[]并再次返回。

问题是我现在需要将此byte []转换为String,然后再转换回byte[],然后再转换回Bitmap。重温我的需求:

Bitmap -> byte[] -> String -> byte[] -> Bitmap

我知道这听起来很奇怪,但我想要完成的事情必须这样做。以下是我的尝试,如果有人能指出我做错了什么我会非常感激!

Bitmap bitmap = mv.getDrawingCache();

// Convert bitmap to byte[]
ByteArrayOutputStream output = new ByteArrayOutputStream(bitmap.getByteCount());
bitmap.compress(Bitmap.CompressFormat.PNG, 100, output);
byte[] imageBytes = output.toByteArray();

// Convert byte[] to string
// I have also tried using Base64.encodeToString(imageBytes, 0);

String encodedString = new String(imageBytes);

// Convert string to byte[]
byte[] newImageBytes = encodedString.getBytes();

if (imageBytes == newImageBytes) {
    Toast.makeText(SignatureActivity.this, "SUCCESS!!", Toast.LENGTH_SHORT).show();
} else { // Sadly, we always get to this point :(
    Toast.makeText(SignatureActivity.this, "BOOO", Toast.LENGTH_SHORT).show();
}

// Convert byte[] back to bitmap
bitmap = BitmapFactory.decodeByteArray(newImageBytes, 0, newImageBytes.length);

再次,转Bitmap -> byte[] -> Bitmap成功,但将转化添加到String并返回会导致最终Bitmap写入0kb的图像。

1 个答案:

答案 0 :(得分:2)

问题不在转换中,而是验证结果的方式。使用==比较两个数组只有在它们是相同的数组引用时才返回true。由于您使用byte[] newImageBytes = encodedString.getBytes();创建新数组,因此始终为false。 See this question for reference.

另一方面,如果您要以某种方式转移或使用字符串,最好使用Base64.encodeToString(imageBytes, Base64.NO_WRAP);来获取字符串,然后使用Base64.decode(encodedString, Base64.NO_WRAP)将其恢复。
您还可以使用copyPixelsToBuffer()方法获取字节数组而不压缩它(例如,请参阅this question)。