Comment puis-je convertir une image en une chaîne Base64?


143

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

J'ai besoin de savoir comment le faire avec Android, car je dois ajouter la fonctionnalité pour télécharger des images sur 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 recherche dans Google et dans Stack Overflow, mais je n'ai pas pu trouver d'exemples faciles que je peux me permettre et aussi je trouve quelques exemples, mais ils ne parlent pas de se transformer en String. Ensuite, je dois transformer en une chaîne à télécharger par JSON sur mon serveur distant.

Réponses:


331

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();

* Mettre à jour *

Si vous utilisez une ancienne bibliothèque SDK (parce que vous voulez qu'elle fonctionne sur les téléphones avec les anciennes versions du système d'exploitation), vous n'aurez pas la classe Base64 intégrée (car elle vient de sortir dans l'API niveau 8 AKA version 2.2).

Consultez cet article pour une solution de contournement:

Comment encoder en base64 décoder Android


ok, et eux 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?
NullPointerException le

Eh bien, avec VARCHAR, vous devez spécifier sa taille, alors peut-être que TEXT serait mieux. L'image pourrait être de n'importe quelle gamme de tailles ...
xil3

Salut, je le teste mais cela me donne une ERREUR en Base64. Il ne peut pas gagner la classe. Je fais Ctrl + Maj + O pour obtenir les importations mais je n'obtiens pas les importations ... Comment résoudre le problème?
NullPointerException

4
Pour moi, je travaillais après avoir remplacé: String encodedImage = Base64.encode (byteArrayImage, Base64.DEFAULT); Par: String encodedImage = Base64.encodeToString (byteArrayImage, Base64.DEFAULT);
PakitoV

3
Est-ce que quelqu'un se rend compte que cette méthode fait une recompression sans signification du fichier? pourquoi est-ce si voté ?? La réponse de Chandra Sekhar est la plus efficace.
ElYeante

103

Au lieu d'utiliser Bitmap, vous pouvez également le faire via un fichier 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 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);

3
Bien sûr, c'est plus efficace; transforme simplement un fichier en sa représentation base64, et évite une recompression absolument dénuée de sens de l'image.
ElYeante

est le fileName ici le chemin du fichier ou le nom réel du fichier ??? N'oubliez pas de me taguer :) Merci.
Rakeeb Rajbhandari

2
@ user2247689 Lorsque vous essayez d'accéder à un fichier, vous devez évidemment donner le chemin complet du fichier avec son nom. Si le fichier est présent dans le même chemin où votre programme source est présent, le nom de fichier suffit.
Chandra Sekhar

2
Une question, que signifie «8192» ici, est-ce la taille du fichier ou quoi?
Devesh Khandelwal

1
ce code ne fonctionne pas, j'ai perdu de nombreuses heures à résoudre le problème.
Ramkesh Yadav

7

Si vous avez besoin de Base64 sur JSON, consultez Jackson : il prend en charge explicitement la lecture / écriture de données binaires en Base64 au niveau bas (JsonParser, JsonGenerator) et au niveau de la liaison de données. Ainsi, vous pouvez juste avoir des POJO avec des propriétés byte [], et l'encodage / décodage est automatiquement géré.

Et assez efficacement aussi, si cela importait.


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

5
// 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

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

2

Si vous faites cela sur Android , voici un assistant copié à 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
(allouera une grande chaîne et peut provoquer un plantage du MOO) Alors, quelle est la solution dans ce cas?
Ibrahim Disouki

1

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

6
Bien que ce code puisse répondre à la question, fournir un contexte supplémentaire concernant la raison et / ou la manière dont ce code répond à la question améliore sa valeur à long terme.
Donald Duck

Une explication serait de mise.
Peter Mortensen

0

Voici le pseudocode 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

Convertissez 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

Voici le code pour le codage d'image et le décodage d'image.

Dans un fichier XML

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="yyuyuyuuyuyuyu"
    android:id="@+id/tv5"
/>

Dans un 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 Base64 string
        String imgString = Base64.encodeToString(byteFormat, Base64.NO_WRAP);

        return imgString;
    }

    @Override
    protected void onPostExecute(String s) {
       textView5.setText(s);
    }
}.execute();

Cela compilera-t-il réellement? Avez-vous oublié quelque chose?
Peter Mortensen

0

Pour ceux qui recherchent une méthode efficace pour convertir un fichier image en une chaîne Base64 sans compression ou convertir d'abord le fichier en bitmap, vous pouvez à la place encoder 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!


-1

Utilisez ce code:

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

Bitmap decodedByte = BitmapFactory.decodeByteArray(decodedString, 0, decodedString.length);

C'est juste le contraire
Rafael Ruiz Muñoz
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.