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

时间:2016-02-14 17:47:16

标签: android image decode encode

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

我做了一件简单的事情:

1)我正在使用http://codebeautify.org/base64-to-image-converter#

中的简单base 64数据

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

3)在android中我通过Web服务正确地获取它,解码它并在图像视图中显示

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

(到目前为止一直很好)

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

生成base64代码
    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

我现在发疯了......有什么想法吗?

由于 此致

4 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

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;
}

答案 2 :(得分:0)

我不明白为什么在你已经拥有位图时再次编码和解码。 顺便说一下,在PNG格式中,90会在“压缩”方法中被忽略。

答案 3 :(得分:0)

这个solution对我有用,我刚刚将Base64.DEFAULT更改为Base64.NO_WRAP 输出将与使用http://freeonlinetools24.com/base64-image

之类的在线转换器时的输出相同。
private String encodeFileToBase64(String filePath)
{
    InputStream inputStream = new FileInputStream(filePath);//You can get an inputStream using any IO API
    byte[] bytes;
    byte[] buffer = new byte[8192];
    int bytesRead;
    ByteArrayOutputStream output = new ByteArrayOutputStream();
    try {
        while ((bytesRead = inputStream.read(buffer)) != -1) {
        output.write(buffer, 0, bytesRead);
    }
    } catch (IOException e) {
    e.printStackTrace();
    }
    bytes = output.toByteArray();
    return Base64.encodeToString(bytes, Base64.NO_WRAP);
}

解码:

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