画像をBase64文字列に変換するにはどうすればよいですか?


143

画像(最大200 KB)をBase64文字列に変換するコードは何ですか?

Androidでそれを行う方法を知る必要があります。メインアプリのリモートサーバーに画像をアップロードする機能を追加し、データベースの行に文字列として配置する必要があるためです。

私はGoogleとStack Overflowで検索していますが、手頃な価格の簡単な例が見つからず、いくつかの例も見つかりましたが、それらは文字列に変換することについて話していません。次に、JSONでリモートサーバーにアップロードする文字列に変換する必要があります。

回答:


330

Base64 Androidクラスを使用できます。

String encodedImage = Base64.encodeToString(byteArrayImage, Base64.DEFAULT);

ただし、画像をバイト配列に変換する必要があります。次に例を示します。

Bitmap bm = BitmapFactory.decodeFile("/path/to/image.jpg");
ByteArrayOutputStream baos = new ByteArrayOutputStream();
bm.compress(Bitmap.CompressFormat.JPEG, 100, baos); // bm is the bitmap object
byte[] b = baos.toByteArray();

*更新*

古いバージョンのSDKライブラリを使用している場合(古いバージョンのOSを搭載した電話で動作させるため)、Base64クラスはパッケージ化されません(APIレベル8 AKAバージョン2.2で提供されたばかりなので)。

この記事で回避策を確認してください。

Androidをbase64エンコードしてデコードする方法


OK、そして彼らはその文字列(encondedImage)をPHP + JSONを使用してリモートデータベース列に配置できますか???? タイプはデータベースの列である必要がありますか?VARCHAR?
NullPointerException

まあ、VARCHARの場合は大きさを指定する必要があるので、おそらくTEXTの方が良いでしょう。画像は任意の範囲のサイズにすることができます...
xil3

こんにちは、私はそれをテストしていますが、Base64でエラーが発生します。それはクラスを気にすることができません。インポートを取得するためにCtrl + shift + Oを作成しますが、インポートを取得しません... solveそれを解決する方法は?
NullPointerException 2011年

4
私にとっては、置き換えた後に作業していました:String encryptedImage = Base64.encode(byteArrayImage、Base64.DEFAULT); レビュアー:String encryptedImage = Base64.encodeToString(byteArrayImage、Base64.DEFAULT);
PakitoV 2011

3
この方法でファイルが無意味に再圧縮されることを誰かが知っていますか?なぜこれはそんなに賛成ですか?チャンドラ・セカールの答えが最も効率的です。
ElYeante 2013年

103

を使用する代わりにBitmap、簡単な方法でこれを行うこともできますInputStream。よくわかりませんが、少し効率的だと思います。

InputStream inputStream = new FileInputStream(fileName); // You can get an inputStream using any I/O API
byte[] bytes;
byte[] buffer = new byte[8192];
int bytesRead;
ByteArrayOutputStream output = new ByteArrayOutputStream();

try {
    while ((bytesRead = inputStream.read(buffer)) != -1) {
        output.write(buffer, 0, bytesRead);
    }
}
catch (IOException e) {
    e.printStackTrace();
}

bytes = output.toByteArray();
String encodedString = Base64.encodeToString(bytes, Base64.DEFAULT);

3
もちろん、これはより効率的です。ファイルをbase64表現に変換するだけで、画像の完全に無意味な再圧縮を回避します。
ElYeante 2013年

ここでfileNameはファイルのパスまたは実際のファイル名ですか??? 私にタグを付けることを忘れないでください:)ありがとう。
Rakeeb Rajbhandari 2013年

2
@ user2247689ファイルにアクセスしようとしているときは、明らかに、ファイルの名前を含む完全なパスを指定する必要があります。ソースプログラムと同じパスにファイルが存在する場合は、ファイル名で十分です。
Chandra Sekhar 2013年

2
質問、ここで「8192」は何を意味しますか、それはファイルサイズですか?
Devesh Khandelwal

1
このコードは機能せず、問題を解決するために何時間も無駄に費やされました。
Ramkesh Yadav

7

JSONでBase64が必要な場合は、Jacksonをチェックしてください。低レベル(JsonParser、JsonGenerator)とデータバインディングレベルの両方で、Base64としてバイナリデータの読み取り/書き込みを明示的にサポートしています。だからあなたはPOJOを持つことができます、byte []プロパティを、エンコード/デコードは自動的に処理されます。

そして、それが問題になれば、かなり効率的にも。


1
私には難しすぎます。これは私のスキルが非常に低いため、Googleでチェックしたところ簡単な例が見つかりません... xil3のようなコード例を教えていただければ理解できます
NullPointerException

5
// Put the image file path into this method
public static String getFileToByte(String filePath){
    Bitmap bmp = null;
    ByteArrayOutputStream bos = null;
    byte[] bt = null;
    String encodeString = null;
    try{
        bmp = BitmapFactory.decodeFile(filePath);
        bos = new ByteArrayOutputStream();
        bmp.compress(Bitmap.CompressFormat.JPEG, 100, bos);
        bt = bos.toByteArray();
        encodeString = Base64.encodeToString(bt, Base64.DEFAULT);
    }
    catch (Exception e){
      e.printStackTrace();
    }
    return encodeString;
}

3

このコードは私のプロジェクトで完璧に動作します:

profile_image.buildDrawingCache();
Bitmap bmap = profile_image.getDrawingCache();
String encodedImageData = getEncoded64ImageStringFromBitmap(bmap);


public String getEncoded64ImageStringFromBitmap(Bitmap bitmap) {
    ByteArrayOutputStream stream = new ByteArrayOutputStream();
    bitmap.compress(CompressFormat.JPEG, 70, stream);
    byte[] byteFormat = stream.toByteArray();

    // Get the Base64 string
    String imgString = Base64.encodeToString(byteFormat, Base64.NO_WRAP);

    return imgString;
}

2

Androidでこれを実行している場合、React Nativeコードベースからコピーしたヘルパーは次のとおりです。

import java.io.ByteArrayOutputStream;
import java.io.Closeable;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;

import android.util.Base64;
import android.util.Base64OutputStream;
import android.util.Log;

// You probably don't want to do this with large files
// (will allocate a large string and can cause an OOM crash).
private String readFileAsBase64String(String path) {
  try {
    InputStream is = new FileInputStream(path);
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    Base64OutputStream b64os = new Base64OutputStream(baos, Base64.DEFAULT);
    byte[] buffer = new byte[8192];
    int bytesRead;
    try {
      while ((bytesRead = is.read(buffer)) > -1) {
        b64os.write(buffer, 0, bytesRead);
      }
      return baos.toString();
    } catch (IOException e) {
      Log.e(TAG, "Cannot read file " + path, e);
      // Or throw if you prefer
      return "";
    } finally {
      closeQuietly(is);
      closeQuietly(b64os); // This also closes baos
    }
  } catch (FileNotFoundException e) {
    Log.e(TAG, "File not found " + path, e);
    // Or throw if you prefer
    return "";
  }
}

private static void closeQuietly(Closeable closeable) {
  try {
    closeable.close();
  } catch (IOException e) {
  }
}

2
(大きな文字列が割り当てられ、OOMがクラッシュする可能性があります)では、この場合の解決策は何ですか?
Ibrahim Disouki 2017年

1

Kotlinのエンコードとデコードのコードは次のとおりです。

 fun encode(imageUri: Uri): String {
    val input = activity.getContentResolver().openInputStream(imageUri)
    val image = BitmapFactory.decodeStream(input , null, null)

    // Encode image to base64 string
    val baos = ByteArrayOutputStream()
    image.compress(Bitmap.CompressFormat.JPEG, 100, baos)
    var imageBytes = baos.toByteArray()
    val imageString = Base64.encodeToString(imageBytes, Base64.DEFAULT)
    return imageString
}

fun decode(imageString: String) {

    // Decode base64 string to image
    val imageBytes = Base64.decode(imageString, Base64.DEFAULT)
    val decodedImage = BitmapFactory.decodeByteArray(imageBytes, 0, imageBytes.size)

    imageview.setImageBitmap(decodedImage)
}

0
byte[] decodedString = Base64.decode(result.getBytes(), Base64.DEFAULT);

6
このコードは質問に答えることがありますが、このコードが質問に答える理由や方法に関する追加のコンテキストを提供すると、長期的な価値が向上します。
ドナルドダック

説明が正しいでしょう。
Peter Mortensen

0

以下はあなたに役立つかもしれない疑似コードです:

public  String getBase64FromFile(String path)
{
    Bitmap bmp = null;
    ByteArrayOutputStream baos = null;
    byte[] baat = null;
    String encodeString = null;
    try
    {
        bmp = BitmapFactory.decodeFile(path);
        baos = new ByteArrayOutputStream();
        bmp.compress(Bitmap.CompressFormat.JPEG, 100, baos);
        baat = baos.toByteArray();
        encodeString = Base64.encodeToString(baat, Base64.DEFAULT);
    }
    catch (Exception e)
    {
        e.printStackTrace();
    }

   return encodeString;
}

0

Androidで画像をBase64文字列に変換します。

ByteArrayOutputStream baos = new ByteArrayOutputStream();
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.yourimage);
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos);
byte[] imageBytes = baos.toByteArray();
String imageString = Base64.encodeToString(imageBytes, Base64.DEFAULT);

0

これが画像のエンコードとデコードのコードです。

XMLファイル内

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="yyuyuyuuyuyuyu"
    android:id="@+id/tv5"
/>

Javaファイル内:

TextView textView5;
Bitmap bitmap;

textView5 = (TextView) findViewById(R.id.tv5);

bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.logo);

new AsyncTask<Void, Void, String>() {
    @Override
    protected String doInBackground(Void... voids) {
        ByteArrayOutputStream stream = new ByteArrayOutputStream();
        bitmap.compress(Bitmap.CompressFormat.JPEG, 70, stream);
        byte[] byteFormat = stream.toByteArray();

        // Get the Base64 string
        String imgString = Base64.encodeToString(byteFormat, Base64.NO_WRAP);

        return imgString;
    }

    @Override
    protected void onPostExecute(String s) {
       textView5.setText(s);
    }
}.execute();

これは実際にコンパイルされますか?何かを省きましたか?
Peter Mortensen

0

最初に圧縮せずに、またはファイルをビットマップに変換せずに画像ファイルをBase64文字列に変換する効率的な方法をお探しの場合は、代わりにファイルをbase64としてエンコードできます。

val base64EncodedImage = FileInputStream(imageItem.localSrc).use {inputStream - >
    ByteArrayOutputStream().use {outputStream - >
            Base64OutputStream(outputStream, Base64.DEFAULT).use {
                base64FilterStream - >
                    inputStream.copyTo(base64FilterStream)
                base64FilterStream.flush()
                outputStream.toString()
            }
      }
}

お役に立てれば!


-1

このコードを使用してください:

byte[] decodedString = Base64.decode(Base64String.getBytes(), Base64.DEFAULT);

Bitmap decodedByte = BitmapFactory.decodeByteArray(decodedString, 0, decodedString.length);

これはちょうど反対である
ラファエル・ルイスムニョス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.