Android base64解码/编码图像到字符串

时间:2015-10-19 09:11:08

标签: java android encoding bitmap base64

好的,我已经阅读了有关此主题的所有问题和答案。我已经读了几天了,没有什么对我有用,所以我有一个直接的问题。此代码生成一个String

public String getStringImage(Bitmap bmp){
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    bmp.compress(Bitmap.CompressFormat.JPEG, 100, baos);
    byte[] imageBytes = baos.toByteArray();
    input = Base64.encodeToString(imageBytes, Base64.DEFAULT);
    return input;
}

此代码从同一图片中生成其他字符串,

  <?php

$data = file_get_contents('Lake_mapourika_NZ.jpeg');
$nova = base64_encode($data);

    echo $nova;

?>

当我在Java中将它们插入到此代码中时:

  public void decodeImage()
{
    byte[] decodedByte = Base64.decode(input, Base64.DEFAULT);
    bitmap = BitmapFactory.decodeByteArray(decodedByte, 0, decodedByte.length);
    imageView.setImageBitmap(bitmap);
}

第一个字符串不会工作第二个工作正常。为什么?为什么java到java不会工作,PHP到java工作正常?

当然弦乐不同也是一个很好的问题。当它们从相同的位图生成时,为什么它们不同?对我来说,似乎Java解码工作正常,但编码不会工作。

我正在使用此代码将我的照片从应用程序发送到服务器,因此每次必须从应用程序编码为字符串时,我无法使用在线转换器。我没有得到任何错误,而且对于用我的手机相机拍摄的照片,我的内存异常。但是当改变质量到50然后我得到解码的字符串,但它不会像往常一样工作。

还有其他办法吗?

2 个答案:

答案 0 :(得分:1)

这不是问题的直接答案,但我认为仍然是正确的答案!此任务绝对不需要Base64编码/解码。

使用multipart/form-data encoding

将图像和其他文件上传到网络服务器
  

内容类型“application / x-www-form-urlencoded”效率低下   用于发送大量二进制数据或包含的文本   非ASCII字符。内容类型“multipart / form-data”应该是   用于提交包含文件,非ASCII数据和表单的表单   二进制数据。

好消息是您不需要自己进行编码。所有流行的http客户端库都在内部处理它。您只需要告诉他们要上传的文件。这是一个answer,展示了如何使用Volley。这是answer,显示了如何使用loopj async http client。

您似乎在服务器端使用PHP。众所周知,PHP非常支持接受file uploads

任何一端都不需要Base64编码/解码。另请注意,当您对base64编码二进制文件时,它的大小会增加大约30%,因此您的base64编码帖子会增加设备上的内存,CPU和数据使用量。

答案 1 :(得分:1)

您的代码中存在错误,但不是您发布的代码。 检查您编码的位图的内容,并在解码时检查您是否使用了正确的输入字符串变量。

您的编码,解码部分工作正常。但是,如果您不依赖成员字段,那么代码会更好。

public String getStringImage(Bitmap bmp)
{
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    bmp.compress(Bitmap.CompressFormat.JPEG, 100, baos);
    byte[] imageBytes = baos.toByteArray();
    String input = Base64.encodeToString(imageBytes, Base64.DEFAULT);
    return input;
}

public void decodeImage(ImageView iv, String input)
{
    byte[] decodedByte = Base64.decode(input, Base64.DEFAULT);
    Bitmap bitmap = BitmapFactory.decodeByteArray(decodedByte, 0, decodedByte.length);
    iv.setImageBitmap(bitmap);
}

测试上述编码/解码方法的代码 - 修改为使用参数而不是成员字段。

Bitmap bm = BitmapFactory.decodeResource(getResources(), R.drawable.thn);
ImageView iv = (ImageView)findViewById(R.id.image_view1);
iv.setImageBitmap(bm);

iv = (ImageView)findViewById(R.id.image_view2);
String b = getStringImage(bm);
decodeImage(iv, b);

回答为什么从Java编码中获取不同的base64字符串并且PHP编码相当简单。使用PHP,您可以使用图像文件并按原样对其进行编码,使用Java可能会从相同的图像文件开始,但是您首先将其解码为位图,然后将该位图编码为JPEG流(这将产生不同的最初编码为base 64的JPEG图像。

PHP: JPEG file -> base64

Java: JPEG file -> Bitmap -> JPEG stream (different from JPEG file) -> base 64