Quelqu'un peut-il me dire le code pour transformer une image (200 Ko maximum) en chaîne Base64?
J'ai besoin de savoir comment le faire avec Android, car je dois ajouter la fonctionnalité permettant de télécharger des images sur un serveur distant de mon application principale en les plaçant dans une ligne de la base de données, sous forme de chaîne.
Je cherche dans google et dans StackOverflow mais je ne trouvais pas d’exemples faciles que je puisse me permettre et j’en trouve également quelques exemples mais ils ne parlent pas de se transformer en String. Ensuite, j'ai besoin de transformer en chaîne pour télécharger par JSON sur mon serveur distant.
Vous pouvez utiliser la classe Android Base64:
String encodedImage = Base64.encodeToString(byteArrayImage, Base64.DEFAULT);
Vous devrez cependant convertir votre image en tableau d'octets. Voici un exemple:
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();
* Mettre à jour *
Si vous utilisez une ancienne bibliothèque SDK (parce que vous voulez que cela fonctionne sur des téléphones avec des versions plus anciennes du système d'exploitation), la classe Base64 ne sera pas intégrée (car elle vient de sortir dans l'API niveau 8, version 2.2).
Consultez cet article pour une solution de contournement:
http://androidcodemonkey.blogspot.com/2010/03/how-to-base64-encode-decode-Android.html
Au lieu d'utiliser Bitmap
, vous pouvez également le faire via la méthode triviale InputStream
. Bien je ne suis pas sûr, mais je pense que c'est un peu efficace
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);
Si vous avez besoin de base64 par rapport à JSON, consultez Jackson : il prend en charge explicitement les données binaires en lecture/écriture en tant que base64 au niveau inférieur (JsonParser, JsonGenerator) et au niveau de liaison des données. Vous pouvez donc simplement avoir des POJO avec des propriétés d'octet [], et l'encodage/décodage est automatiquement géré . Et assez efficacement aussi, si cela importe.
// 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;
}
ce préfet de code exécuté dans mon projet
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;
}
Si vous faites cela sur Android, voici une aide copiée à partir de la base de code 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) {
}
}
Voici un code pour image encode
et dcode
Dans le fichier xml
<TextView
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:text="yyuyuyuuyuyuyu"
Android:id="@+id/tv5"
/>
Dans le fichier 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);
Vous trouverez ci-dessous le pseudo-code qui peut vous aider:
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;
}
Voici le code d'encodage et de décodage dans 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)
}
Convertir une image en chaîne base64 sous Android
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);
Pour ceux qui recherchent une méthode efficace pour convertir un fichier image en chaîne Base64 sans compression ni conversion préalable du fichier en bitmap, vous pouvez plutôt coder le fichier en base64
val base64EncodedImage = FileInputStream(imageItem.localSrc).use {inputStream - >
ByteArrayOutputStream().use {outputStream - >
Base64OutputStream(outputStream, Base64.DEFAULT).use {
base64FilterStream - >
inputStream.copyTo(base64FilterStream)
base64FilterStream.flush()
outputStream.toString()
}
}
}
J'espère que cela t'aides!