Android base64 decoding/encoding 图片转字符串

Android base64 decoding/encoding image to 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 解码工作正常但编码不会工作。

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

还有其他方法吗?

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

图像和其他文件使用 multipart/form-data encoding

上传到网络服务器

The content type "application/x-www-form-urlencoded" is inefficient for sending large quantities of binary data or text containing non-ASCII characters. The content type "multipart/form-data" should be used for submitting forms that contain files, non-ASCII data, and binary data.

好消息是您不需要自己进行编码。所有流行的 http 客户端库都在内部处理它。您只需要告诉他们要上传哪些文件。这是一个 answer showing how to do it with Volley. Here is an answer,展示了如何使用 loopj async http 客户端。

您似乎在服务器端使用 PHP。如您所知,PHP 对接受 file uploads.

具有出色的内置支持

Base64 encoding/decoding 两端都不需要。另请注意,当您对二进制文件进行 base64 编码时,它的大小会增加大约 30%,因此您的 base64 编码 post 会增加设备上的内存、cpu 和数据使用量。

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

您的编码、解码部分工作正常。不过,如果您不依赖成员字段,该代码会更好。

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

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

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 编码和 PHP 编码得到不同的 base64 字符串的答案相当简单。使用 PHP 您正在获取图像文件并按原样对其进行编码,而使用 Java 您可能从相同的图像文件开始,但是您首先将其解码为位图,然后对该位图进行编码到 JPEG 流(这将产生与您开始使用的图像不同的 JPEG 图像),您最终编码为 base 64。

PHP: JPEG file -> base64

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