5

この(以下の)コードを使用してSDカードの写真からbase64文字列を作成しましたが、動作しますが、それをデコードしようとすると(さらに下)java.lang.outOfMemoryException、おそらく文字列を合理的に分割していないため、エンコードする前と同じように、デコードする前のサイズ。

byte fileContent[] = new byte[3000];
StringBuilder b = new StringBuilder();
try{
     FileInputStream fin = new FileInputStream(sel);
     while(fin.read(fileContent) >= 0) {
    b.append(Base64.encodeToString(fileContent, Base64.DEFAULT));
     }
}catch(IOException e){

}

上記のコードはうまく機能しますが、次のコードで画像をデコードしようとすると問題が発生します。

byte[] imageAsBytes = Base64.decode(img.getBytes(), Base64.DEFAULT);
ImageView image = (ImageView)this.findViewById(R.id.ImageView);
image.setImageBitmap(
    BitmapFactory.decodeByteArray(imageAsBytes, 0, imageAsBytes.length)
);

私もこの方法を試しました

byte[] b = Base64.decode(img, Base64.DEFAULT);
Bitmap bitmap = BitmapFactory.decodeByteArray(b, 0, b.length);
image.setImageBitmap(bitmap);

ここで、文字列を画像エンコード コードのようなセクションに分割する必要があると思いますが、それを行う方法がわかりません。

4

3 に答える 3

13

AsyncTask のようなバックグラウンド スレッドで画像をデコードするか、 BitmapFactory を使用して画像の品質を下げる必要があります。例:

 BitmapFactory.Options options = new BitmapFactory.Options();

            options.inSampleSize = 2;
            options.inPurgeable=true;
        Bitmap bm = BitmapFactory.decodeFile("Your image exact loaction",options);
        ByteArrayOutputStream baos = new ByteArrayOutputStream();  
        bm.compress(Bitmap.CompressFormat.JPEG, 100, baos); //bm is the bitmap object 

        byte[] b = baos.toByteArray(); 
        String encodedImage = Base64.encodeToString(b, Base64.DEFAULT);
于 2013-04-09T09:14:20.143 に答える
1

あなたには2つの問題があります

  • base64 エンコーディングには、さらに多くのスペースが必要です。3 バイトを 4 文字に変換 (係数 8/3)
  • 一度にファイル全体を読む

あなたの最初のアプローチがこの問題を解決したのと同じように。したがって、そのバージョンを使用してください

ところで、なぜdecodeFileではなくdecodeByteArrayを使っているです

于 2013-04-09T09:14:23.477 に答える
1

一時ファイルにデコードして、そのファイルからイメージを作成しようとする場合があります。

base64 に関しては、1 文字あたり 6 ビット、または 6x4=24 ビット = 4 文字あたり 3 バイトです。したがって、base64 の 4 文字を取っても、対応する 3 バイトは壊れません。つまり、base64 でエンコードされたデータを 4 の倍数の文字インデックスで分割できます。

于 2013-04-09T09:14:28.080 に答える