画像(最大200KB)をBase64 Stringに変換するコードを教えてもらえますか?
Androidでそれを行う方法を知る必要があります。メインアプリのリモートサーバーに画像をアップロードする機能を追加し、文字列としてデータベースの行に配置する必要があるためです。
私はグーグルとStackOverflowで検索していますが、余裕のある簡単な例を見つけることができず、いくつかの例を見つけましたが、文字列に変換することについて話していません。次に、JSONでリモートサーバーにアップロードするために文字列に変換する必要があります。
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またはバージョン2.2でリリースされたため)。
回避策については、この記事をご覧ください。
http://androidcodemonkey.blogspot.com/2010/03/how-to-base64-encode-decode-Android.html
Bitmap
を使用する代わりに、簡単なInputStream
を使用してこれを行うこともできます。よくわかりませんが、少し効率的だと思います
InputStream inputStream = new FileInputStream(fileName);//You can get an inputStream using any IO 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);
JSONを介したbase64が必要な場合は、 Jackson を確認してください。低レベル(JsonParser、JsonGenerator)とデータバインディングレベルの両方で、base64としてバイナリデータの読み取り/書き込みを明示的にサポートしています。したがって、byte []プロパティを持つPOJOを作成するだけで、エンコード/デコードが自動的に処理されます。そして、それも非常に効率的です。
// 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;
}
私のプロジェクトで実行されるこのコード完全
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 base 64 string
String imgString = Base64.encodeToString(byteFormat, Base64.NO_WRAP);
return imgString;
}
これをAndroidで実行している場合、ここに React Native codebase からコピーしたヘルパーを示します。
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) {
}
}
image encode
およびdcode
In 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 base 64 string
String imgString = Base64.encodeToString(byteFormat, Base64.NO_WRAP);
return imgString;
}
@Override
protected void onPostExecute(String s) {
textView5.setText(s);
}
}.execute();
byte[] decodedString = Base64.decode(result.getBytes(), Base64.DEFAULT);
以下はあなたを助けるかもしれない擬似コードです:
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;
}
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)
}
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);
圧縮せずに画像ファイルを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()
}
}
}
お役に立てれば!