为啥 decodeByteArray 返回 null?

Posted

技术标签:

【中文标题】为啥 decodeByteArray 返回 null?【英文标题】:Why is decodeByteArray returning null?为什么 decodeByteArray 返回 null? 【发布时间】:2015-11-25 17:26:06 【问题描述】:

我正在尝试将图像保存到数据库并在 UI 上检索和显示它们。

我正在使用以下代码将单击/从图库中的图像上传到 My SQL。

public void onActivityResult(int requestCode, int resultCode, Intent data) 
    Bitmap photo = null;
    if (requestCode == CAMERA_REQUEST && resultCode == getActivity().RESULT_OK) 
        photo = (Bitmap) data.getExtras().get("data");
        // imageView.setImageBitmap(photo);



    else if(requestCode == GALLERY_REQUEST && resultCode == getActivity().RESULT_OK) 

        Uri selectedImage = data.getData();
        String[] filePathColumn = MediaStore.Images.Media.DATA;

        Cursor cursor = getActivity().getContentResolver().query(
                selectedImage, filePathColumn, null, null, null);
        cursor.moveToFirst();

        int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
        String filePath = cursor.getString(columnIndex);
        cursor.close();


        photo = BitmapFactory.decodeFile(filePath);
    


下面的代码上传到db。

 void createParam()
     photo.compress(Bitmap.CompressFormat.PNG, 100, byteArrayBitmapStream);
     byte[] b = byteArrayBitmapStream.toByteArray();
     String encodedImage = Base64.encodeToString(b, Base64.DEFAULT);
     params.add(new BasicNameValuePair("image", encodedImage));
  

这段代码用于解码从 db 检索到的图像字符串。

public Bitmap getImage() 
        if("null".equalsIgnoreCase(image))
            return null;
        else
        byte[] decodedString = Base64.decode(image, Base64.NO_WRAP);
        Bitmap decodedByte = BitmapFactory.decodeByteArray(decodedString, 0,     decodedString.length);
    return decodedByte;
    

问题是方法中的 decodeByteArray 返回 null。并且字符串没有被解码。前置摄像头点击的图像不会发生此问题。 请帮我找出问题!

【问题讨论】:

'Base64.DEFAULT);'。不匹配 'Base64.NO_WRAP);'。 greenapps 我尝试制作两个 no_wrap。但这并没有帮助。我不断得到这个:D/skia:---解码器->解码返回错误 将两者设为默认值。剩下的我想知道你的数据库在哪里,因为两者都是java代码。请告诉您在哪里进行编码以及在哪里进行解码。 我也尝试将它们都设为“默认”,但这不起作用。 DB 没有问题,因为它适用于某些点击,而不适用于某些点击。 你没有回答我所有的问题。 【参考方案1】:

我也得到了 null 并通过设置 options.inJustDecodeBounds=false; 来修复它

public static String bitmapToBase64(Bitmap bitmap) 
    ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
    bitmap.compress(Bitmap.CompressFormat.JPEG, 100, byteArrayOutputStream);
    byte[] byteArray = byteArrayOutputStream .toByteArray();
    return Base64.encodeToString(byteArray, Base64.DEFAULT);



public static Bitmap base64ToBitmap(String b64) 
    byte[] imageAsBytes = Base64.decode(b64.getBytes(), Base64.DEFAULT);
    BitmapFactory.Options opts = new BitmapFactory.Options();
    opts.inJustDecodeBounds=false;
    return BitmapFactory.decodeByteArray(imageAsBytes, 0, imageAsBytes.length, opts);

【讨论】:

以上是关于为啥 decodeByteArray 返回 null?的主要内容,如果未能解决你的问题,请参考以下文章

BitmapFactory.decodeByteArray() 始终返回 null(手动创建的字节数组)

为啥 environment.getProperty("spring.profiles.active") 在使用 @ActiveProfiles 激活测试中的配置文件时返回 nul

如何将字节数组中的图像文件数据转换为位图?

BitmapFactory.decodeByteArray OutOfMemory

BitmapFactory decodeByteArray 裁剪图像

通过BitmapFactory.decodeByteArray把byte[]转成Bitmap出现的OOM的解决方法