Base64 编码在 android 之外不起作用

Base64 encoding not working outside android

对不起,如果我做错了什么。我想做的是从 android 中的 camera2 api 捕获图像,然后将该图像转换为 base64 编码,下面是我的代码

 private String getBase64Image(Bitmap bitmap) {
    ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
    bitmap.compress(Bitmap.CompressFormat.JPEG, 15, byteArrayOutputStream);
    byte[] bytes = byteArrayOutputStream.toByteArray();
    String base64Image = Base64.encodeToString(bytes, Base64.NO_WRAP);
    return base64Image;
}

private void decodeBase64Image(String base64Image) {
    byte[] bytes = Base64.decode(base64Image, Base64.NO_WRAP);
    Bitmap bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);
    imageView.setVisibility(View.VISIBLE);
    imageView.setImageBitmap(bitmap);
    saveFile(bytes);
}

这是我如何捕捉图像

@Override
        public void onImageAvailable(ImageReader imageReader) {
            Image image = imageReader.acquireLatestImage();
            ByteBuffer byteBuffer = image.getPlanes()[0].getBuffer();
            byte jpegBytes[] = new byte[byteBuffer.remaining()];
            byteBuffer.get(jpegBytes);
            Bitmap imageBitmap = BitmapFactory.decodeByteArray(jpegBytes, 0, jpegBytes.length);

            String base64Image = getBase64Image(imageBitmap);
            Log.d("mi", "widthpx:" + image.getWidth() + " heightpx:" + image.getHeight());
            Log.d("mi", "Base64Image:" + base64Image);
            decodeBase64Image(base64Image);
            image.close();
        }
    }, null);

上面的代码可以正常工作,将图像转换为 base64 编码,然后对其进行解码并在我可以看到的 imageview 上设置。到这里为止一切正常。但问题是,当我使用 base64 编码并尝试使用一些在线 base64 字符串到图像转换器时,它没有给我任何结果。下面是我如何获得 base64 编码的字符串

/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDADUlKC8oITUvKy88OTU/UIVXUElJUKN1e2GFwarLyL6qurfV8P//1eL/5re6////////////zv//////////////2wBDATk8PFBGUJ1XV53/3Lrc////////////////////////////////////////////////////////////////////wAARCA2YEiADASIAAhEBAxEB/8QAGQABAQEBAQEAAAAAAAAAAAAAAAECAwQF/8QALBABAQACAgICAgIDAAIDAQEBAAECESExA0ESEzJRImEEcYEzQhQjkaGx0f/EABcBAQEBAQAAAAAAAAAAAAAAAAABAgP/xAAbEQEBAQEAAwEAAAAAAAAAAAAAARECITFBEv/aAAwDAQACEQMRAD8A56NNDKsaNNppRnRprRoE0aU0gg1o+IMrI3MV+IMyNTFqRQZmI0lBmpWmbAQVAEym2gHmyx1WHpyx3HHKaqjB7VAalVjpZQUAG8ctO+Hk3w8rWOVlB7ZVcMPI645bQaAAAAABFAAABUAABQFEQFFABAAAAAAAAUAAAAAAVAFQAAAAAAAAAAAAAABAAAAAAAAAABUAUABFAEAUVFAAAAAEUAAAAAAQAAVAVRAFEUAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAAAAAAABUAAUEFARUAUABFQAAFQAUQAABUVAAAUEAAAFAQAAAAABUUEIAAAAAAAAAAACKgCKgAACKgDn5brHbd4eXzZ/K69A55XdtZNih7CKInsVBTtvGM4x1wm+QbxjciSNyAsVIqAKAigAAAAAKAigAAAAAAAAAAAAAAAAAAAAAAAoAAAAAAAAAigAAAAAAAAAAAAAAACgigCKAAAAAAAAAAAAAAAAAAAAAAAAAAKAigICgiooCKgKioCggKIoCAACgigCCgIoAAAIqAKigAAAAiooCACgAAAAACAKAAigAACKgKAAioCgAAAgKCCgAACKgKIoAAAAIKAAAAAAAAAAAAAAAAAIoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAigCKAgoCI0gJpGjQM6NNJYDOk02aBjRY1o0DGjTek0DGjTek0DOkb0mgZqN2JoGRrSaBNC6NAyKaBFNAIKKIKiACggAoAIENAAAKixdA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

解决方案

正如@toble 的回答,我没有在 Log.d() 中获得完整的 base64Image 字符串,所以我记录完整的 base64Image 的操作如下。

   private void logLargeString(String content) {
    if (content.length() > 3000) {
        Log.d("mi", content.substring(0, 3000));
        logLargeString(content.substring(3000));
    } else {
        Log.d("mi", content);
    }
}

希望这对其他人有所帮助。

您的 base64 字符串仅包含 jpeg 图像的开头。只有图像的前 60 行包含实际的彩色像素。

确保使用完整的 base64 字符串,您应该能够看到完整的图像。您可能使用了以下记录的字符串:

            Log.d("mi", "Base64Image:" + base64Image);

输出可能在 logcat 中被裁剪了。