Android 将图像编码为base64不等于原始图像

Android 将图像编码为base64不等于原始图像,android,image,decode,encode,Android,Image,Decode,Encode,我正在尝试对图像视图进行编码/解码,我查看了50多个示例,但它仍然不起作用 我做了一件简单的事情: 1) 我使用的是来自 2) 我把它放在mysql数据库的blob字段中(托管在远程服务器中) 3) 在安卓系统中,我通过一个web服务正确地获取它,解码它并在图像视图中显示 public static Bitmap decodeBase64(String input) { byte[] decodedByte = Base64.decode(input.getBytes(), Base64

我正在尝试对图像视图进行编码/解码,我查看了50多个示例,但它仍然不起作用

我做了一件简单的事情:

1) 我使用的是来自

2) 我把它放在mysql数据库的blob字段中(托管在远程服务器中)

3) 在安卓系统中,我通过一个web服务正确地获取它,解码它并在图像视图中显示

public static Bitmap decodeBase64(String input)
{
    byte[] decodedByte = Base64.decode(input.getBytes(), Base64.DEFAULT);
    return BitmapFactory.decodeByteArray(decodedByte, 0, decodedByte.length);
}
(到目前为止还不错)

4) 我正在对图像视图中的内容进行编码(放置在步骤3中),并使用

    imageGrupo.buildDrawingCache();
    Bitmap bitmap = imageGrupo.getDrawingCache();
    ByteArrayOutputStream stream=new ByteArrayOutputStream();
    bitmap.compress(Bitmap.CompressFormat.PNG, 90, stream);
    byte[] image=stream.toByteArray();
    finalImagemStr = Base64.encodeToString(image, 0);
5) 如果我将生成的base64与我在3中收到的base64进行比较,它们就不一样了

他们应该是对的

6) 将4)中生成的base64字符串放入远程数据库并再次读取时,它会显示

  java.lang.IllegalArgumentException: bad base-64
我现在快发疯了。。。有什么想法吗

谢谢
因为Base64的文本太长,无法放入我的日志控制台,我花了一个小时来研究为什么不工作,结果是生成的文本是相同的,但它没有输出整个文本,只有部分文本,这里可能就是这种情况

更新OP的代码请求

这是我目前使用的方法,它是可靠的,工作没有任何问题

public static String bitmapToBase64(Bitmap bitmap) {
    ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
    bitmap.compress(Bitmap.CompressFormat.JPEG, 30, byteArrayOutputStream);
    byte[] byteArray = byteArrayOutputStream.toByteArray();
    String encoded = Base64.encodeToString(byteArray, Base64.DEFAULT);

    return encoded;
}
为了确保从imageView获取“安全”位图,getDrawableCache是一个棘手的问题。用这个

public static Bitmap loadBitmapFromView(View v) {
    Bitmap b = Bitmap.createBitmap( v.getLayoutParams().width, v.getLayoutParams().height, Bitmap.Config.ARGB_8888);                
    Canvas c = new Canvas(b);
    v.layout(0, 0, v.getLayoutParams().width, v.getLayoutParams().height);
    v.draw(c);
    return b;
}

我不明白你为什么在已经有位图的情况下还要重新编码和解码。 顺便说一句,在PNG格式中,90在“压缩”方法中被忽略。

试试my,它解释了如何将位图编码到base64,并将base64成功解码回位图。如果需要精确的原始图像,可以跳过代码的缩放图像部分。

这对我来说很有效,我刚刚将Base64.DEFAULT更改为Base64.NO\u WRAP 输出将与使用在线转换器时相同,如

解码:

byte[] data = Base64.decode(base64, Base64.NO_WRAP);

谢谢是的,我想到了。但在前50个字符中,我已经注意到一些差异。。。但我还是把它发送到服务器,当我读回它时,它不会解码。因此,在这个过程中出现了一些问题。那么你有任何有效的例子吗?谢谢我编辑了这篇文章,罗格。请您检查一下,如果您觉得有用,可以选择“接受答案”吗?谢谢。为了确保,您如何从图像视图生成位图?我使用的是:imageGrupo.buildDrawingCache();位图Bitmap=imageGrupo.getDrawingCache();但是仍然不起作用。。无错误,但无图像显示..接收以“ivborw0kggoaaansuheugaaaniaazcayaaadigvzlaaqn0leqv”开头的base64字符串。从相应位图再次创建base64时,它会生成“/9j/4AAQSKZJRGABAAQAAAQABAD/2WBDABSFBCUERS”。。。。。你不觉得太不一样了吗?我在接收时解码,然后解码发送到服务器。在本例中,它是同一个文件,因为我只是在测试。当这项工作,我可以加载任何文件从画廊和发送到服务器。但是如果我不能编码这个,我就不能编码任何。。。
byte[] data = Base64.decode(base64, Base64.NO_WRAP);