web-dev-qa-db-fra.com

Comment convertir une image en chaîne Base64?

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.

131

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

296
xil3

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);
92
Chandra Sekhar

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.

6
StaxMan
// 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;
}
4

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;
}
3
tej shah

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) {
  }
}
2
Martin Konicek

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();
0
Asif Ali
byte[] decodedString = Base64.decode(result.getBytes(), Base64.DEFAULT);
0
fdhchc

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;
     }
0
vivek

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)
}
0
Sam

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);
0
Aftab Alam

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!

0
Alessi 42