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

时间:2013-09-14 17:03:08

标签: android

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

我使用以下两种方法将Drawable转换为编码字符串并将字符串解码回Drawable。

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(String s)以获取Drawable。然后我将Drawable显示为textview。

问题在于,当图像重新加载到textview中时,质量会降低。每次重新加载都会降低质量。同样,当我在encodeImageToString()中显示时,我检查了bytearray大小。

有人可以建议我在这里找不到任何东西。将图像重新加载到字符串然后串回到图像应该不会影响图像的质量或大小。但在这种情况下情况并非如此。

1 个答案:

答案 0 :(得分:3)

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

这是一种看待事物的天真方式:对图像I进行编码的结果是encode(I) -> I + δ,其中δ是压缩工件。如果您现在再次对此进行编码,则执行此操作:encode(I + δ)您浪费时间和空间编码压缩工件

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