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

时间:2013-06-13 09:49:58

标签: android

我正在服务器上传高分辨率和大图像。 我正在使用接受Base64转换字符串中的图像的API。 我正在将Image转换为Base64字符串并上传到服务器,但如果Image很大,那么它会提供OutOfMemory Exception。 任何人都可以建议我如何解决这个问题。

这是我在Base64编码字符串中将myBitmap(Bitmap to 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;
        }
    }

1 个答案:

答案 0 :(得分:0)

可能你可能会在

上获得例外
byte[] b = baos.toByteArray();

要处理您想要考虑的recycling图片。

此外,使用Multipart被认为是更好的选择,因为您使用的是Base64,您可能也想在Jen's Post上进行思考。

还有一个建议是,如果您使用的是11级或更高级别的API,那么您可以考虑使用:

android:largeHeap="true"

这将帮助您安全地执行转换和处理(前提是您没有泄漏任何变量)。有关此问题的详细信息,请参阅Application上的文档。

如果您仍然遇到任何问题,请告诉我。