将位图转换为字节数组,再转换为字符串,然后再反向操作

3

我已经尝试了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 大小的图像。


只要字符串表示位图,它包含什么内容有关系吗? - Jave
只要最终能够从中检索出原始位图,那么这就无关紧要。 - Alex
也许在Android上默认的字符编码总是UTF-8,但通常应避免使用默认的字符编码。我会明确地在String构造函数和调用getBytes中使用UTF-8。 - David Conrad
1个回答

2
问题不在于转换,而在于如何验证结果。使用==比较两个数组只有在它们引用同一个数组时才返回true。由于您使用byte[] newImageBytes = encodedString.getBytes();创建了一个新的数组,这将始终返回false。 参考此问题
另外,如果您要传输或以某种方式使用该字符串,则最好使用Base64.encodeToString(imageBytes,Base64.NO_WRAP)来获取字符串,并使用Base64.decode(encodedString, Base64.NO_WRAP)将其转换回去。 您还可以使用copyPixelsToBuffer()方法获取未压缩的字节数组(有关示例,请参见此问题)。

我应该补充一点,在此之前,我正在使用.equals()来比较字节数组,但它也没有起作用:( 不过我会改回来并尝试您的建议! - Alex
1
@RhinoFeeder 注意,所引用的问题的答案使用了 Arrays.equals(a1, a2),而不是 .equals(a2) - Jave

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接