0

サーバーに高解像度で大きな画像をアップロードしています。Base64 に変換された文字列で画像を受け入れる API を使用しています。Image を Base64 文字列に変換してサーバーにアップロードしていますが、Image が大きい場合は OutOfMemory Exception が発生します。これを解決する方法を教えてくれる人はいますか?

これは、Base64 でエンコードされた文字列の myBitmap (ビットマップからアップロード) を変換してサーバーに送信する関数です。画像を圧縮したくありません。

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;
        }
    }
4

1 に答える 1

0

おそらく、例外が発生している可能性があります

byte[] b = baos.toByteArray();

それを処理するには、画像のリサイクルを検討してください。

また、Base64 を使用しているため、Jen's Postについても検討することをお勧めします。

もう 1 つの提案は、API レベル 11 以上を使用している場合は、次の使用を検討することです。

android:largeHeap="true"

これは、変換と処理を安全に実行するのに役立ちます (変数をリークしていない場合)。詳細については、Applicationのドキュメントを参照してください。

問題が解決しない場合はお知らせください。

于 2013-06-13T14:51:38.460 に答える