Come posso convertire un'immagine in una stringa Base64?


143

Qual è il codice per trasformare un'immagine (massimo 200 KB) in una stringa Base64?

Devo sapere come farlo con Android, perché devo aggiungere la funzionalità per caricare immagini su un server remoto nella mia app principale, inserendole in una riga del database, come una stringa.

Sto cercando in Google e in Stack Overflow, ma non sono riuscito a trovare semplici esempi che posso permettermi e ne trovo anche alcuni, ma non stanno parlando di trasformarli in String. Quindi ho bisogno di trasformarmi in una stringa da caricare da JSON sul mio server remoto.

Risposte:


331

È possibile utilizzare la classe Android Base64:

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

Dovrai però convertire la tua immagine in un array di byte. Ecco un esempio:

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

* Aggiornare *

Se stai utilizzando una libreria SDK più vecchia (perché vuoi che funzioni su telefoni con versioni precedenti del sistema operativo) non avrai la classe Base64 inclusa (poiché è appena uscita in AKA versione 2.2 API livello 8).

Consulta questo articolo per una soluzione alternativa:

Come codificare base64 decodificare Android


ok, e loro posso mettere quella stringa (encondedImage) in una colonna di database remota con PHP + JSON ???? quale tipo deve essere la colonna del database? VARCHAR?
NullPointerException,

Bene, con VARCHAR devi specificare quanto sarebbe grande, quindi forse TEXT sarebbe meglio. L'immagine potrebbe essere di qualsiasi gamma di dimensioni ...
xil3,

Ciao, lo sto provando ma mi dà ERRORE in Base64. Non riesce a capire la classe. Faccio Ctrl + Maiusc + O per ottenere le importazioni ma non le importa ... ¿come risolverlo?
NullPointerException il

4
Per me funzionava dopo aver sostituito: String encodedImage = Base64.encode (byteArrayImage, Base64.DEFAULT); By: String encodedImage = Base64.encodeToString (byteArrayImage, Base64.DEFAULT);
PakitoV,

3
Qualcuno si rende conto che questo metodo rende una ricompressione insignificante del file ?? perché è così votato ?? La risposta di Chandra Sekhar è la più efficiente.
ElYeante,

103

Invece di usare Bitmap, puoi anche farlo in modo banale InputStream. Bene, non ne sono sicuro, ma penso che sia un po 'efficiente.

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
Naturalmente questo è più efficiente; trasforma semplicemente un file nella sua rappresentazione base64 ed evita una ricompressione dell'immagine assolutamente insignificante.
ElYeante,

è il fileName qui il percorso del file o il nome del file effettivo ??? Per favore, non dimenticare di taggarmi :) Grazie.
Rakeeb Rajbhandari,

2
@ user2247689 Quando stai tentando di accedere a un file ovviamente devi dare il percorso completo del file incluso il suo nome. Se il file è presente nello stesso percorso in cui è presente il programma di origine, il nome del file è sufficiente.
Chandra Sekhar,

2
Una domanda, cosa significa "8192" qui, è la dimensione del file o cosa?
Devesh Khandelwal,

1
questo codice non funziona, ho perso molte ore per aggiungere il problema.
Ramkesh Yadav,

7

Se hai bisogno di Base64 su JSON, controlla Jackson : ha un supporto esplicito per i dati binari in lettura / scrittura come Base64 sia a livello basso (JsonParser, JsonGenerator) che a livello di associazione dati. Quindi puoi avere solo POJO con proprietà byte [] e la codifica / decodifica viene gestita automaticamente.

E anche in modo abbastanza efficiente, dovrebbe importare.


1
troppo difficile per me, le mie capacità sono molto basse con questo, l'ho controllato su Google e non riesco a trovare semplici esempi ... forse se puoi darmi esempi di codice come xil3 lo
capirò

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

Questo codice funziona perfettamente nel mio progetto:

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

Se lo stai facendo su Android , ecco un aiutante copiato dalla base di codice di 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
(assegnerà una stringa di grandi dimensioni e può causare un arresto anomalo OOM) Quindi qual è la soluzione in questo caso?
Ibrahim Disouki,

1

Ecco il codice di codifica e decodifica in 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
Mentre questo codice può rispondere alla domanda, fornendo ulteriore contesto riguardo al perché e / o al modo in cui questo codice risponde alla domanda migliora il suo valore a lungo termine.
Paperino

Una spiegazione sarebbe in ordine.
Peter Mortensen,

0

Di seguito è riportato lo pseudocodice che può aiutarti:

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

Converti un'immagine in stringa Base64 in 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

Ecco il codice per la codifica e la decodifica delle immagini.

In un file XML

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

In un file 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();

Sarà effettivamente compilato? Hai lasciato qualcosa fuori?
Peter Mortensen,

0

Per coloro che cercano un metodo efficiente per convertire un file di immagine in una stringa Base64 senza compressione o convertire prima il file in una bitmap, è possibile invece codificare il file come base64

val base64EncodedImage = FileInputStream(imageItem.localSrc).use {inputStream - >
    ByteArrayOutputStream().use {outputStream - >
            Base64OutputStream(outputStream, Base64.DEFAULT).use {
                base64FilterStream - >
                    inputStream.copyTo(base64FilterStream)
                base64FilterStream.flush()
                outputStream.toString()
            }
      }
}

Spero che questo ti aiuti!


-1

Usa questo codice:

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

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

Questo è esattamente il contrario
Rafael Ruiz Muñoz, il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.