Android 如何以Base64转换字符串将高分辨率图像上载到服务器

Android 如何以Base64转换字符串将高分辨率图像上载到服务器,android,Android,我正在上传服务器上的高分辨率和大图像。 我使用的API接受Base64转换字符串中的图像。 我正在将图像转换为Base64字符串并上传到服务器,但若图像很大,则会出现OutOfMemory异常。 有谁能建议我如何解决这个问题吗 这是我将Base64编码字符串中的myBitmap(位图到upoload)转换为发送到服务器的函数。 我不想压缩图像 if(myBitmap!=null){ ByteArrayOutputStream baos = new ByteArrayOutputStrea

我正在上传服务器上的高分辨率和大图像。 我使用的API接受Base64转换字符串中的图像。 我正在将图像转换为Base64字符串并上传到服务器,但若图像很大,则会出现OutOfMemory异常。 有谁能建议我如何解决这个问题吗

这是我将Base64编码字符串中的myBitmap(位图到upoload)转换为发送到服务器的函数。 我不想压缩图像

if(myBitmap!=null){
    ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
    myBitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos); //bm is the bitmap object
    byte[] b = baos.toByteArray();

        // I am passing encodedImg as image parameter.
    String encodedImg = new String(Base64.encodeBase64(b));
    try{
        baos.close();
        baos = null;
        b = null;
    }
    catch (Exception e) {
        e.printStackTrace();
    }
}


// Below code is to open camera/gallery to select Image
btnCamera.setOnClickListener(new OnClickListener() {
            public void onClick(View v) {
                String fileName = "profile.jpg";
                ContentValues values = new ContentValues();
                values.put(MediaStore.Images.Media.TITLE, fileName);
                values.put(MediaStore.Images.Media.DESCRIPTION, "Image capture by camera");

                imageUri = getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);

                Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
                intent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 1);
                intent.putExtra("crop", "true");
                intent.putExtra("aspectX", 3);
                intent.putExtra("aspectY", 4);
                intent.putExtra("outputX", 480);
                intent.putExtra("outputY", 640);
                intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());
                intent.putExtra("noFaceDetection",true);
                startActivityForResult(intent, 1);
                a.dismiss();
            }
        });
        btnGalary.setOnClickListener(new OnClickListener() {
            public void onClick(View v) {
                Intent intent = new Intent();
                intent.setType("image/*");
                intent.putExtra("crop", "true");
                intent.putExtra("aspectX", 3);
                intent.putExtra("aspectY", 4);

                intent.putExtra("outputX", 480);
                intent.putExtra("outputY", 640);

                intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());
                intent.putExtra("noFaceDetection",true);
                intent.setAction(Intent.ACTION_GET_CONTENT);
                startActivityForResult(Intent.createChooser(intent, "Gallery"),2);
                a.dismiss();
            }
        });


//My onActivityResult

@Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        switch (requestCode) {

        case 1:
            if (resultCode == RESULT_CANCELED)
                break;
            else if (resultCode == RESULT_OK) {
                try{
                    long imageId=ContentUris.parseId(imageUri);

                    myBitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(), imageUri);          

                    isImageChanged = true;
                    profilePic.setScaleType(ScaleType.CENTER_CROP);
                    profilePic.setImageBitmap(myBitmap);
                    break;
                }
                catch(Exception e){
                    e.printStackTrace();
                }
            }

        case 2:
            if (resultCode == RESULT_CANCELED)
                break;
            try {
                Uri imageUri = data.getData();

                long imageId=ContentUris.parseId(imageUri);

                myBitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(), imageUri);

                profilePic.setScaleType(ScaleType.CENTER_CROP);
                isImageChanged = true;
                profilePic.setImageBitmap(myBitmap);
            } catch (Exception e) {
                e.printStackTrace();
            }
            break;
        }
    }

你可能会得到一个例外

byte[] b = baos.toByteArray();

处理你想考虑你的图片。

此外,使用Multipart被认为是一个更好的选择,因为您使用的是Base64,您可能也想考虑一下

另一个建议是,如果你的API水平是11或更高,那么你可以考虑使用:

android:largeHeap="true"
这将帮助您安全地执行转换和处理(前提是您没有泄漏任何变量)。有关这方面的详细信息,请参阅上的文档


如果您仍然面临任何问题,请告诉我。

请使用适当的代码和参考资料解释您的问题。这一定是一个代码问题,因为即使你打算上传10MB大小的图像,内存也不会用完。现在你能帮我解决这个问题吗?嗨,Abhy我使用的是android:largeHeap=true,我不能回收我的图像,因为如果我不能成功注册,我就需要使用那个位图。嗨,我没有得到“成功注册”部分。你的意思是你正在回收的位图,你以后在代码中的某个地方试图使用它吗?请通过指出问题的具体位置进行解释?是的,我正在使用该位图。意味着我无法回收该位图。