1

私のAndroidアプリでは、ユーザーにモバイルから画像ファイルを選択させ、それをテキストビューに表示してから、次のページに移動する前にjson文字列に保存しています(次のページに移動することは、アクティビティをリロードすることと同じです)新しいデータセット)。

Drawable をエンコードされた文字列に変換し、文字列をデコードして Drawable に戻すために、以下の 2 つの方法を使用しています。

public String encodeImageToString(Drawable d) throws Exception{
    Bitmap bm = ((BitmapDrawable) d).getBitmap();
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    bm.compress(Bitmap.CompressFormat.JPEG, 100, baos);     byte[] byteArrayImage = baos.toByteArray();
    Toast.makeText(getBaseContext(), "Size After encoding to string:"+byteArrayImage.length, Toast.LENGTH_LONG).show();
    String encodedImage = Base64.encodeToString(byteArrayImage, Base64.DEFAULT);
    bm=null;
    baos.close();
    baos=null;
    return encodedImage;
}

public Drawable decodeStringToImage(String encodedImage){   
    byte[] decodedString = Base64.decode(encodedImage, Base64.DEFAULT);
    Bitmap decodedByte = BitmapFactory.decodeByteArray(decodedString, 0, decodedString.length);
    Drawable d = new BitmapDrawable(getResources(),decodedByte);
    Toast.makeText(getBaseContext(), "Size after decoding string to image: " + decodedByte.getByteCount(), Toast.LENGTH_LONG).show();


decodedByte = null;
    return d;

}

私が直面している問題は、ページに戻るたびに画質が低下することです。また、Toast を使用して encodeImageToString() で表示する bytearray サイズも、リロードするたびに増加し続けます。

私の一連のアクションは-選択したファイルからテキストビューに画像をロードします(ロード中に画像を圧縮します。上記のコードは共有していません)-ユーザーが次のページに移動したら、テキストビューの画像をbase64でエンコードされた文字列に保存します。ここで、encodeImageToString(Drawable d) メソッドを呼び出し、画像を文字列に変換して JSON 文字列に保存します。ユーザーがページに戻ったら、JSON 文字列から文字列を取得し、decodeStringToImage(String s) を呼び出して、Drawable を取得します。 . 次に、その Drawable を textview に表示します。

問題は、画像がテキストビューにリロードされると品質が低下することです。リロードするたびに品質が低下します。また、encodeImageToString() で表示する bytearray のサイズを確認したところ、増加し続けています。

私がここに欠けているものがあれば、誰かが提案してもらえますか。画像を文字列にリロードしてから文字列を画像に戻しても、画像の品質やサイズに影響はありません。しかし、この場合はそうではありません。

4

1 に答える 1