156

大きなビットマップ (携帯電話のカメラで撮影した写真) を Base64 文字列に変換するにはどうすればよいですか?

4

7 に答える 7

347

次のメソッドを使用して、ビットマップをバイト配列に変換します。

ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();  
bitmap.compress(Bitmap.CompressFormat.PNG, 100, byteArrayOutputStream);
byte[] byteArray = byteArrayOutputStream .toByteArray();

バイト配列から base64 をエンコードするには、次のメソッドを使用します

String encoded = Base64.encodeToString(byteArray, Base64.DEFAULT);
于 2012-02-10T07:20:59.460 に答える
34

私は速い解決策を持っています。ファイルを作成するだけImageUtil.java

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.util.Base64;
import java.io.ByteArrayOutputStream;

public class ImageUtil
{
    public static Bitmap convert(String base64Str) throws IllegalArgumentException
    {
        byte[] decodedBytes = Base64.decode(
            base64Str.substring(base64Str.indexOf(",")  + 1),
            Base64.DEFAULT
        );

        return BitmapFactory.decodeByteArray(decodedBytes, 0, decodedBytes.length);
    }

    public static String convert(Bitmap bitmap)
    {
        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
        bitmap.compress(Bitmap.CompressFormat.PNG, 100, outputStream);

        return Base64.encodeToString(outputStream.toByteArray(), Base64.DEFAULT);
    }

}

使用法:

Bitmap bitmap = ImageUtil.convert(base64String);

また

String base64String = ImageUtil.convert(bitmap);
于 2016-12-07T22:25:06.283 に答える
14

jeet の回答の問題は、画像のすべてのバイトをバイト配列にロードすることです。これにより、ローエンド デバイスでアプリがクラッシュする可能性があります。代わりに、まずイメージをファイルに書き込み、Apache のBase64InputStreamクラスを使用してそれを読み取ります。次に、そのファイルの InputStream から Base64 文字列を直接作成できます。次のようになります。

//Don't forget the manifest permission to write files
final FileOutputStream fos = new FileOutputStream(yourFileHere); 
bitmap.compress(Bitmap.CompressFormat.PNG, 100, fos);

fos.close();

final InputStream is = new Base64InputStream( new FileInputStream(yourFileHere) );

//Now that we have the InputStream, we can read it and put it into the String
final StringWriter writer = new StringWriter();
IOUtils.copy(is , writer, encoding);
final String yourBase64String = writer.toString();

ご覧のとおり、上記のソリューションは代わりにストリームを直接処理し、すべてのバイトを変数にロードする必要がないため、メモリ フットプリントが大幅に削減され、ローエンド デバイスでクラッシュする可能性が低くなります。Base64 文字列自体を String 変数に入れることはお勧めできないという問題がまだあります。これも OutOfMemory エラーが発生する可能性があるためです。しかし、バイト配列をなくすことで、少なくともメモリ消費量を半分に削減できました。

ファイルへの書き込みステップをスキップしたい場合は、OutputStream を InputStream に変換する必要がありますが、これはそれほど簡単ではありません ( PipedInputStreamを使用する必要がありますが、2 つのストリームが常に必要なため、これは少し複雑です)。別のスレッドにある)。

于 2014-07-22T01:57:23.183 に答える