3

ギャラリーから画像を読み込み、base64 に変換したいと思います。

これはそれほど難しいことではありません。だから私はこのようにします:

まず、ギャラリーを開いて画像を選択します。

picteureBtn.setOnClickListener(new View.OnClickListener() {
            private Uri imageUri;

            public void onClick(View view) {
                Intent i = new Intent(
                        Intent.ACTION_PICK,
                        android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);

                startActivityForResult(i, RESULT_LOAD_IMAGE);

            }
        });

2 番目の onActivityResult:

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

        if (requestCode == RESULT_LOAD_IMAGE && resultCode == RESULT_OK && null != data) {
            Uri selectedImage = data.getData();
            String[] filePathColumn = { MediaStore.Images.Media.DATA };

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

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


        }


    }

そして最後に、私は自分のimageどちらをデコードしたいですかpicutrePath

                String b64;
                StringEntity se;
                String entityContents="";
                if (!picturePath.equals("")){
                    Bitmap bm = BitmapFactory.decodeFile(picturePath);
                    ByteArrayOutputStream baos = new ByteArrayOutputStream();  
                    bm.compress(Bitmap.CompressFormat.JPEG, 100, baos);

                    byte[] b = baos.toByteArray(); 
                    b64=Base64.encodeToString(b, Base64.DEFAULT);
                }

残念ながら私は得る:

06-24 16:38:14.296: E/AndroidRuntime(3538): FATAL EXCEPTION: main
06-24 16:38:14.296: E/AndroidRuntime(3538): java.lang.OutOfMemoryError
06-24 16:38:14.296: E/AndroidRuntime(3538):     at java.io.ByteArrayOutputStream.toByteArray(ByteArrayOutputStream.java:122)

誰かが私が間違いを犯している場所を指摘できますか?

4

2 に答える 2

5

変更することをお勧めします

Bitmap bm = BitmapFactory.decodeFile(picturePath);
ByteArrayOutputStream baos = new ByteArrayOutputStream();  
bm.compress(Bitmap.CompressFormat.JPEG, 100, baos);
//added lines
bm.recycle();
bm = null;   
//added lines 
byte[] b = baos.toByteArray(); 
b64=Base64.encodeToString(b, Base64.DEFAULT);

そうすれば、ビットマップをアプリのメモリに 2 回読み込む必要がなくなります。

于 2013-06-24T14:54:09.377 に答える
4

これについて話している記事はたくさんありますが、基本的には、クラスBitmapを見てデコードする前に次元を計算する必要があります。別の解決策があります。ギャラリーから写真を選択しているので、次のようにinBitmapFactoryを取得できます。BitmapactivityForResult

Bitmap image = (Bitmap) data.getExtras().get("data");

Intent次のような画像を取得するために開始できます。

Intent intent = new Intent();    
intent.setType("image/*");
intent.setAction(Intent.ACTION_GET_CONTENT); 
startActivityForResult(intent, RESULT_LOAD_IMAGE);
于 2013-06-24T14:52:10.043 に答える