154 votes

Comment puis-je convertir une image en une chaîne de caractères Base64 ?

Quel est le code pour transformer une image (maximum de 200 Ko) en une chaîne de caractères Base64 ?

J'ai besoin de savoir comment le faire avec Android, car je dois ajouter la fonctionnalité de téléchargement d'images vers un serveur distant dans 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 Stack Overflow, mais je n'ai pas trouvé d'exemples faciles que je puisse me permettre et j'ai aussi trouvé quelques exemples, mais ils ne parlent pas de transformer en String. Alors j'ai besoin de transformer en une chaîne pour télécharger par JSON à mon serveur distant.

356voto

xil3 Points 7220

Vous pouvez utiliser la classe Android Base64 :

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

Vous devrez cependant convertir votre image en un 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();

* 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 du système d'exploitation), vous n'aurez pas la classe Base64 intégrée (puisqu'elle vient de sortir au niveau 8 de l'API, c'est-à-dire la version 2.2).

Consultez cet article pour trouver une solution de contournement :

Comment coder en base64 et décoder Android

0 votes

Ok, et si je peux mettre cette chaîne (encondedImage) dans une colonne de base de données distante avec PHP+JSON ? ??? quel type doit être la colonne de la base de données ? VARCHAR ?

0 votes

Avec VARCHAR, vous devez spécifier la taille du fichier, alors peut-être que TEXT serait plus approprié. L'image peut être de n'importe quelle taille...

0 votes

Bonjour, je le teste mais il me donne un ERROR en Base64. Il ne peut pas trouver la classe. Je fais Ctrl +shift+O pour obtenir les imports mais n'obtient pas les imports... ¿Comment le résoudre ?

107voto

Chandra Sekhar Points 6512

Au lieu d'utiliser Bitmap vous pouvez également le faire par l'intermédiaire d'une méthode triviale 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 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);

4 votes

Bien sûr, c'est plus efficace ; il suffit de transformer un fichier en sa représentation base64, et d'éviter une recompression de l'image qui n'a absolument aucun sens.

0 votes

Le nom du fichier est-il le chemin d'accès au fichier ou le nom réel du fichier ? N'oubliez pas de me marquer :) Merci.

2 votes

Lorsque vous essayez d'accéder à un fichier, vous devez évidemment donner le chemin complet du fichier, y compris son nom. Si le fichier est présent dans le même chemin que votre programme source, alors le nom du fichier est suffisant.

8voto

StaxMan Points 34626

Si vous avez besoin de Base64 sur JSON, consultez la page Jackson Il a un support explicite pour la lecture/écriture de données binaires en Base64 à la fois au niveau bas (JsonParser, JsonGenerator) et au niveau des liaisons de données. Vous pouvez donc simplement avoir POJOs avec des propriétés byte[], et l'encodage/décodage est automatiquement géré.

Et assez efficacement aussi, d'ailleurs.

1 votes

Trop difficile pour moi, mes compétences sont très faibles avec cela, j'ai vérifié sur google et je ne trouve pas d'exemples faciles... peut-être que si vous pouvez me donner des exemples de code comme xil3, je le comprendrai.

5voto

// 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;
}

3voto

tej shah Points 1974

Ce code fonctionne parfaitement 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 Base64 string
    String imgString = Base64.encodeToString(byteFormat, Base64.NO_WRAP);

    return imgString;
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X