在Android中将位图对象编码和解码为Base64字符串

65

我希望能够将 Bitmap 对象编码和解码为字符串的形式,使用的是 base64。我使用的是Android API10。

我尝试了以下方法对 Bitmap 进行编码,但没有成功。

public static String encodeTobase64(Bitmap image) {
    Bitmap immagex=image;
    ByteArrayOutputStream baos = new ByteArrayOutputStream();  
    immagex.compress(Bitmap.CompressFormat.JPEG, 100, baos);
    byte[] b = baos.toByteArray();
    String imageEncoded = Base64.encodeToString(b,Base64.DEFAULT);

    Log.e("LOOK", imageEncoded);
    return imageEncoded;
}
3个回答

213
public static String encodeToBase64(Bitmap image, Bitmap.CompressFormat compressFormat, int quality)
{
    ByteArrayOutputStream byteArrayOS = new ByteArrayOutputStream();
    image.compress(compressFormat, quality, byteArrayOS);
    return Base64.encodeToString(byteArrayOS.toByteArray(), Base64.DEFAULT);
}

public static Bitmap decodeBase64(String input)
{
    byte[] decodedBytes = Base64.decode(input, 0);
    return BitmapFactory.decodeByteArray(decodedBytes, 0, decodedBytes.length);
}

使用示例:

String myBase64Image = encodeToBase64(myBitmap, Bitmap.CompressFormat.JPEG, 100);
Bitmap myBitmapAgain = decodeBase64(myBase64Image);

但是长度太长了,服务器返回了“使用JSON JavaScriptSerializer进行序列化或反序列化时出错。字符串的长度超过了maxJsonLength属性设置的值”,有没有办法克服这个问题?@Roman Truba - Logic
1
@逻辑基于Base64字符串的图像必须作为POST请求正文数据传递。我认为,大型图像无法适应JSON。 - Roman Truba
@RomanTruba 当我使用gson将包含encodeToBase64字符串的类转换为json字符串时,我遇到了java.lang.OutOfMemoryError错误:无法分配128887990字节的内存,而只有16777216个空闲字节和70MB直到OOM。我该如何将这样的字符串转换为json字符串? - KJEjava48
@KJEjava48 使用较小的图像。 - Roman Truba
@RomanTruba 当我上传图片时,我会将其压缩并转换为字符串,一张图片可能需要500kb或600kb左右,然后当我使用gson将其集体转换为json字符串时,会出现内存不足的错误。 - KJEjava48
@KJEjava48 我不知道我怎么能帮忙。在发送图片时尽量避免使用json。 - Roman Truba

1
将位图编码为图像:

 ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
    bitmap.compress(Bitmap.CompressFormat.PNG, 80, byteArrayOutputStream);
   byte[] imageBytes = byteArrayOutputStream.toByteArray();
   String encodedImage = Base64.encodeToString(imageBytes, Base64.DEFAULT);
    Log.d("bytearray", String.valueOf(byteArrayOutputStream.toByteArray()));
    Log.d("encodedimage",encodedImage);

0
请注意,如果您从其他进程(如JSInterface)获取了base64字符串,则该字符串将以base64的标头开头,例如“data:image/png;base64,”。如果您使用BitmapFactory.decodeByteArray对其进行解码,则需要将其截断。
String dataStr = thumb.startsWith("data:image") ? thumb.substring(thumb.indexOf(',') + 1) : thumb;
byte[] decodedString = Base64.decode(dataStr, Base64.DEFAULT);
Bitmap decodedByte = BitmapFactory.decodeByteArray(decodedString, 0, decodedString.length);

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