Wie kann ich ein Bild in eine Base64-Zeichenfolge konvertieren?

143

Wie lautet der Code zum Umwandeln eines Bildes (maximal 200 KB) in einen Base64-String?

Ich muss wissen, wie es mit Android geht, da ich die Funktionalität zum Hochladen von Bildern auf einen Remote-Server in meiner Haupt-App hinzufügen und sie als Zeichenfolge in eine Zeile der Datenbank einfügen muss.

Ich suche in Google und in Stack Overflow, aber ich konnte keine einfachen Beispiele finden, die ich mir leisten kann, und ich finde auch einige Beispiele, aber sie sprechen nicht davon, sich in einen String umzuwandeln. Dann muss ich mich in eine Zeichenfolge verwandeln, um sie von JSON auf meinen Remote-Server hochzuladen.

NullPointerException
quelle

Antworten:

330

Sie können die Base64-Android-Klasse verwenden:

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

Sie müssen Ihr Bild jedoch in ein Byte-Array konvertieren. Hier ist ein Beispiel:

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

* Update *

Wenn Sie eine ältere SDK-Bibliothek verwenden (da diese auf Telefonen mit älteren Versionen des Betriebssystems funktionieren soll), ist die Base64-Klasse nicht enthalten (da sie gerade in API Level 8 AKA Version 2.2 veröffentlicht wurde).

In diesem Artikel finden Sie eine Problemumgehung:

Wie Base64 Codierung Decodierung Android

xil3
quelle
ok, und ihnen kann ich diesen String (encondedImage) mit PHP + JSON in eine entfernte Datenbankspalte einfügen ???? Welcher Typ muss die Spalte der Datenbank sein? VARCHAR?
NullPointerException
Nun, mit VARCHAR müssen Sie angeben, wie groß es sein würde, also wäre TEXT vielleicht besser. Bild könnte jede Größenordnung sein ...
xil3
Hallo, ich teste es, aber es gibt mir Fehler in Base64. Es kann der Klasse nichts geben. Ich mache Strg + Umschalt + O, um die Importe zu erhalten, bekomme aber keine Importe ... ¿Wie löse ich das?
NullPointerException
4
Für mich arbeitete nach dem Ersetzen: String encodedImage = Base64.encode (byteArrayImage, Base64.DEFAULT); Von: String encodedImage = Base64.encodeToString (byteArrayImage, Base64.DEFAULT);
PakitoV
3
Weiß jemand, dass diese Methode eine bedeutungslose Neukomprimierung der Datei bewirkt? Warum ist das so positiv bewertet? Chandra Sekhars Antwort ist die effizienteste.
ElYeante
103

Anstatt zu verwenden Bitmap, können Sie dies auch durch eine Trivialität tun InputStream. Ich bin mir nicht sicher, aber ich denke, es ist ein bisschen effizient.

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);
Chandra Sekhar
quelle
3
Das ist natürlich effizienter; transformiert einfach eine Datei in ihre base64-Darstellung und vermeidet eine absolut bedeutungslose Rekomprimierung des Bildes.
ElYeante
Ist der Dateiname hier der Pfad der Datei oder der tatsächliche Dateiname? Bitte vergiss nicht mich zu markieren :) Danke.
Rakeeb Rajbhandari
2
@ user2247689 Wenn Sie versuchen, auf eine Datei zuzugreifen, müssen Sie natürlich den vollständigen Pfad der Datei einschließlich ihres Namens angeben. Wenn sich die Datei im selben Pfad befindet, in dem sich Ihr Quellprogramm befindet, reicht der Dateiname aus.
Chandra Sekhar
2
Eine Frage, was bedeutet '8192' hier, ist es Dateigröße oder was?
Devesh Khandelwal
1
Dieser Code funktioniert nicht und hat viele Stunden von mir verschwendet, um das Problem zu beheben.
Ramkesh Yadav
7

Wenn Sie Base64 über JSON benötigen, lesen Sie Jackson : Es unterstützt explizit das Lesen / Schreiben von Binärdaten als Base64 sowohl auf der niedrigen Ebene (JsonParser, JsonGenerator) als auch auf der Datenbindungsebene. Sie können also nur POJOs mit byte [] -Eigenschaften haben, und das Codieren / Decodieren wird automatisch durchgeführt.

Und sollte das auch ziemlich effizient sein.

StaxMan
quelle
1
zu schwer für mich, meine Fähigkeiten sind damit sehr gering, ich habe es auf Google überprüft und kann keine einfachen Beispiele finden ... Vielleicht werde ich es verstehen, wenn Sie mir Codebeispiele wie xil3 geben können
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;
}
krishan kumar Sharma
quelle
3

Dieser Code läuft perfekt in meinem Projekt:

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

Wenn Sie dies unter Android tun , finden Sie hier einen Helfer, der aus der React Native-Codebasis kopiert wurde :

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) {
  }
}
Martin Konicek
quelle
2
(weist eine große Zeichenfolge zu und kann einen OOM-Absturz verursachen) Was ist in diesem Fall die Lösung?
Ibrahim Disouki
1

Hier ist der Kodierungs- und Dekodierungscode 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)
}
Sam
quelle
0
byte[] decodedString = Base64.decode(result.getBytes(), Base64.DEFAULT);
fdhchc
quelle
6
Während dieser Code die Frage möglicherweise beantwortet, verbessert die Bereitstellung eines zusätzlichen Kontexts darüber, warum und / oder wie dieser Code die Frage beantwortet, ihren langfristigen Wert.
Donald Duck
Eine Erklärung wäre angebracht.
Peter Mortensen
0

Unten ist der Pseudocode, der Ihnen helfen kann:

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

Konvertieren Sie ein Bild in einen Base64-String 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);
Aftab Alam
quelle
0

Hier ist Code für die Bildcodierung und Bilddecodierung.

In einer XML-Datei

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

In einer Java-Datei:

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();
Asif Ali
quelle
Wird dies tatsächlich kompiliert? Hast du etwas ausgelassen?
Peter Mortensen
0

Wenn Sie nach einer effizienten Methode suchen, um eine Bilddatei ohne Komprimierung in eine Base64-Zeichenfolge zu konvertieren oder die Datei zuerst in eine Bitmap zu konvertieren, können Sie die Datei stattdessen als base64 codieren

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

Hoffe das hilft!

Alessi 42
quelle
-1

Verwenden Sie diesen Code:

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

Bitmap decodedByte = BitmapFactory.decodeByteArray(decodedString, 0, decodedString.length);
PJ2104
quelle
Dies ist genau das Gegenteil
Rafael Ruiz Muñoz