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.

127
demandé sur Paolo 2011-01-28 19:39:21

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

286
répondu xil3 2012-03-07 07:24:24

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);
87
répondu Chandra Sekhar 2013-07-26 06:25:01

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.

6
répondu StaxMan 2011-01-28 19:43:17

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;
}
3
répondu tej shah 2015-07-25 13:28:46
// 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
répondu krishan kumar Sharma 2017-10-06 06:36:42

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) {
  }
}
2
répondu Martin Konicek 2017-05-05 15:31:32
byte[] decodedString = Base64.decode(result.getBytes(), Base64.DEFAULT);
0
répondu fdhchc 2017-01-10 19:26:23

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;
     }
0
répondu vivek 2017-10-06 08:56:04

utilisez ce Code:

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

Bitmap decodedByte = BitmapFactory.decodeByteArray(decodedString, 0, decodedString.length);
-1
répondu PJ2104 2017-06-19 08:26:15