Android BitmapFactory在对Base64解码后的字节数组进行操作时返回null。

6

我有一个服务器,上面存储了多张图片,大小从1.5 kb到9 Mb不等。这些图片来自于电脑、平板和手机。服务器使用Base64编码将它们转换成字符串,然后发送给安卓客户端。但是其中一张300 kb的图片在使用 BitmapFactory.decodeByteArray 解码时会返回 null… 而且这张图片在在线解码器中被成功解码。

byte[] decodedString = Base64.decode(image64, Base64.DEFAULT);
Bitmap decodedByte = BitmapFactory.decodeByteArray(decodedString, 0, ecodedString.length);

我已经两天找不到答案了。

有什么想法吗?谢谢!

P.S.

 private boolean decodeImage64(String uid, String image64, String name) {
    Bitmap decodedByte;
    boolean result = false;
    if (image64 != null && !image64.isEmpty()) {

        try {
            Log.e(TAG, "decodeImage64: image64.getBytes().length = " + image64.getBytes().length);
            byte[] decodedString = Base64.decode(image64, Base64.DEFAULT);
            Log.e(TAG, "decodeImage64: decodedString = " + decodedString + "  , decodedString.length = " + decodedString.length);
            decodedByte = BitmapFactory.decodeByteArray(decodedString, 0, decodedString.length);
            Log.e(TAG, "decodeImage64: decodedByte = " + decodedByte);

            if (decodedByte != null) {
                FileOutputStream out = null;
                try {
                    out = new FileOutputStream(getImageFolderName() + "/" + uid + ".png");
                    decodedByte.compress(Bitmap.CompressFormat.PNG, 100, out);
                    decodedByte.recycle();
                    out.close();

                } catch (Exception e) {
                    Log.e(TAG, Log.getStackTraceString(e));
                } finally {
                    try {
                        if (out != null) {
                            out.close();
                        }
                        if (decodedByte != null){
                            decodedByte.recycle();
                        }
                    } catch (IOException e) {
                        Log.e(TAG, Log.getStackTraceString(e));
                    }
                }
                result = true;
            }else {
                Log.e(TAG, "  !!!!!!!!!!!!!!!!!!!!!!! decodeImage64: decodedByte = null "  + name);
            }
        }catch (Exception e){
            Log.e(TAG, Log.getStackTraceString(e));
        }
    } else {
        Log.e(TAG, "decodeImage64: image = null " + name);
    }
    return result;
}

而logcat

良好的图像:

06-29 02:33:57.465 18197-18584/cps.agrovisio E/myLogs:  ------------------------- doInBackground: Good photo
06-29 02:34:13.993 18197-18584/cps.agrovisio E/myLogs: decodeImage64: image64.getBytes().length = 2264744
06-29 02:34:14.085 18197-18584/cps.agrovisio E/myLogs: decodeImage64: decodedString = [B@bb8956d  , decodedString.length = 1676499
06-29 02:34:14.635 18197-18584/cps.agrovisio E/myLogs: decodeImage64: decodedByte = android.graphics.Bitmap@a6d05a2

图像质量差:

06-29 02:33:56.041 18197-18584/сps.agrovisio E/myLogs:  ------------------------- doInBackground: Bad photo 
06-29 02:33:57.177 18197-18584/cps.agrovisio E/myLogs: decodeImage64: image64.getBytes().length = 372570
06-29 02:33:57.194 18197-18584/cps.agrovisio E/myLogs: decodeImage64: decodedString = [B@abcf243  , decodedString.length = 275799
06-29 02:33:57.245 18197-18584/cps.agrovisio E/myLogs: decodeImage64: decodedByte = null

除了大小之外,这些图像有什么不同之处? - goto
所有照片都是jpg格式。来自Android平板电脑的问题。 - Viktor Burmaka
字符串太大了,它在txt文件中:https://www.dropbox.com/s/3n4doyimeo8v9lz/base64image.txt?dl=0 - Viktor Burmaka
我认为问题在于你的字符串大于64k,当我想将其添加到我的项目中时,它会给出“常量字符串太长”的错误提示。所以你能否在这里获取字符串的大小:获取Java字符串字节大小的方法 - Yasin Kaçmaz
@ViktorBurmaka 我认为大小并不重要,也许你可以发布你的方法和日志记录,我们会考虑一下? - Yasin Kaçmaz
显示剩余4条评论
2个回答

0

谢谢!但我不能使用Picasso。我在json中有几个参数,其中一个是base64格式的图像。 - Viktor Burmaka

0

image64中切割出部分data:image/jpg;base64,。只保留编码字符串。

您可以使用substring方法来完成,它会起作用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接