Android 将图像编码/解码为base64字符串时,图像质量会发生变化
在我的android应用程序中,我让用户从他/她的手机中选择一个图像文件,在文本视图中显示,然后在导航到下一页之前,我将其保存在json字符串中(导航到下一页与使用新数据集重新加载活动相同) 我使用以下两种方法将可绘制字符串转换为编码字符串,并将字符串解码回可绘制字符串Android 将图像编码/解码为base64字符串时,图像质量会发生变化,android,Android,在我的android应用程序中,我让用户从他/她的手机中选择一个图像文件,在文本视图中显示,然后在导航到下一页之前,我将其保存在json字符串中(导航到下一页与使用新数据集重新加载活动相同) 我使用以下两种方法将可绘制字符串转换为编码字符串,并将字符串解码回可绘制字符串 public String encodeImageToString(Drawable d) throws Exception{ Bitmap bm = ((BitmapDrawable) d).getBitmap();
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。我也怀疑这一点。谢谢你的意见。我改变了逻辑,尽量避免编码。现在好多了。