java - Base64 编码在 Android 之外不起作用

标签 java android encoding base64 android-camera2

抱歉,如果我做了一些愚蠢的事情。我试图做的是从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 中被裁剪。

关于java - Base64 编码在 Android 之外不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46977692/

相关文章:

java - 在 Eclipse 中允许不正确的包名称

java - 如何在 java 中使用 php web 服务

由于收集复杂,Android 应用程序崩溃。无法评估表达式 - 无法生成表达式 KTObject 文字异常

Java - 使用 java.Scanner 时文件看起来相同,但未评估为 "equal"

powershell - PowerShell 的 UTF-8 输出

java - 从 jPBC 保存和加载非对称 key

java - Weblogic应用程序提示缺少某些类,如何调试?

java - 手动加密

android - ImageView setVisibility(0) 和空指针异常

android - ConstraintLayout 流程助手示例