Android 将图像编码/解码为base64字符串时,图像质量会发生变化

Android 将图像编码/解码为base64字符串时,图像质量会发生变化,android,Android,在我的android应用程序中,我让用户从他/她的手机中选择一个图像文件,在文本视图中显示,然后在导航到下一页之前,我将其保存在json字符串中(导航到下一页与使用新数据集重新加载活动相同) 我使用以下两种方法将可绘制字符串转换为编码字符串,并将字符串解码回可绘制字符串 public String encodeImageToString(Drawable d) throws Exception{ Bitmap bm = ((BitmapDrawable) d).getBitmap();

在我的android应用程序中,我让用户从他/她的手机中选择一个图像文件,在文本视图中显示,然后在导航到下一页之前,我将其保存在json字符串中(导航到下一页与使用新数据集重新加载活动相同)

我使用以下两种方法将可绘制字符串转换为编码字符串,并将字符串解码回可绘制字符串

public String encodeImageToString(Drawable d) throws Exception{
    Bitmap bm = ((BitmapDrawable) d).getBitmap();
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    bm.compress(Bitmap.CompressFormat.JPEG, 100, baos);     byte[] byteArrayImage = baos.toByteArray();
    Toast.makeText(getBaseContext(), "Size After encoding to string:"+byteArrayImage.length, Toast.LENGTH_LONG).show();
    String encodedImage = Base64.encodeToString(byteArrayImage, Base64.DEFAULT);
    bm=null;
    baos.close();
    baos=null;
    return encodedImage;
}

public Drawable decodeStringToImage(String encodedImage){   
    byte[] decodedString = Base64.decode(encodedImage, Base64.DEFAULT);
    Bitmap decodedByte = BitmapFactory.decodeByteArray(decodedString, 0, decodedString.length);
    Drawable d = new BitmapDrawable(getResources(),decodedByte);
    Toast.makeText(getBaseContext(), "Size after decoding string to image: " + decodedByte.getByteCount(), Toast.LENGTH_LONG).show();


decodedByte = null;
    return d;

}
我面临的问题是,每次导航回页面时,图像质量都会下降。还有我在使用Toast的encodeImageToString()中显示的bytearray大小,随着每次重新加载而不断增加

我的行动顺序是 -将所选文件中的图像加载到textview(加载时压缩图像。我没有共享上面的代码) -用户导航到下一页后,我将textview图像保存到base64编码字符串中。这里我调用方法encodeImageToString(Drawable d),将图像转换为字符串,并将其存储在JSON字符串中 -用户导航回页面后,我从JSON字符串中检索字符串,然后调用decodeStringToImage(字符串s)以获取可绘制的内容。然后,我将该绘图显示到textview中

问题是,当图像重新加载到textview时,质量会下降。每次重新加载都会降低质量。此外,当我检查encodeImageToString()中显示的bytearray大小时,它会不断增加


有人能告诉我这里有什么我遗漏的吗。将图像重新加载到字符串,然后再将字符串重新加载到图像,应该不会影响图像的质量或大小。但在这种情况下并非如此。

每次jpeg编码操作都会降低图像质量,因此您希望将编码操作的数量保持在最低限度

下面是一种简单的看待事物的方式:对图像进行编码的结果是
encode(I)->I+δ
,其中
δ
是压缩伪影。如果您现在再次对其进行编码,您将执行以下操作:
encode(I+δ)
:您将浪费时间和空间来编码压缩工件


解决方案:在显示图像时,还要保留一份已编码的base64字符串的副本。选择图像后,只需传输此字符串。不要重新编码图像。

JPEG是一种有损格式。试试Bitmap.CompressFormat.PNG。我也怀疑这一点。谢谢你的意见。我改变了逻辑,尽量避免编码。现在好多了。