Comment convertir une image en chaîne Base64?
est-ce que quelqu'un peut me dire le code pour transformer une image (maximum de 200KB) en chaîne de Base64?
j'ai besoin de savoir comment le faire avec android, parce que je dois ajouter la fonctionnalité de télécharger des images sur un serveur distant dans mon application principale en les mettant dans une rangée de la base de données, comme une chaîne de caractères.
je cherche dans google et dans StackOverflow mais je n'ai pas pu trouver des exemples faciles que je peux se permettre et aussi je trouve quelques exemples, mais ils ne parlent pas sur le point de se transformer en Chaîne. Ensuite, je dois me transformer en chaîne de caractères pour télécharger par JSON sur mon serveur distant.
9 réponses
vous pouvez utiliser la classe base64 Android:
String encodedImage = Base64.encodeToString(byteArrayImage, Base64.DEFAULT);
vous devez convertir votre image dans un tableau de byte cependant. 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();
* mise à Jour *
si vous utilisez une bibliothèque SDK plus ancienne (parce que vous voulez qu'elle fonctionne sur des téléphones avec des versions plus anciennes de L'OS), vous n'aurez pas la classe Base64 empaquetée (puisqu'elle vient de sortir dans la version 2.2 de niveau 8 de L'API).
voir cet article pour un work-around:
http://androidcodemonkey.blogspot.com/2010/03/how-to-base64-encode-decode-android.html
au lieu d'utiliser Bitmap
, vous pouvez également le faire à travers trivial InputStream
. Eh 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 au-dessus de JSON, consultez Jackson : il a un support explicite pour les données binaires lire/écrire comme base64 à la fois au niveau bas (JsonParser, JsonGenerator) et le niveau de liaison de données. Vous pouvez donc simplement avoir des POJOs avec des propriétés byte [], et encoding/décodage est traité automatiquement. Et assez efficacement aussi, si cela importe.
ce préfet de code exécute 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;
}
// 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;
}
si vous faites cela sur Android , voici un helper copié du 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) {
}
}
byte[] decodedString = Base64.decode(result.getBytes(), Base64.DEFAULT);
voici 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;
}
utilisez ce Code:
byte[ ] decodedString = Base64.decode(Base64String.getBytes(), Base64.DEFAULT);
Bitmap decodedByte = BitmapFactory.decodeByteArray(decodedString, 0, decodedString.length);