Bagaimana saya bisa mengubah gambar menjadi string Base64?

143

Apa kode untuk mengubah gambar (maksimum 200 KB) menjadi String Base64?

Saya perlu tahu bagaimana melakukannya dengan Android, karena saya harus menambahkan fungsionalitas untuk mengunggah gambar ke server jauh di aplikasi utama saya, menempatkannya ke dalam deretan basis data, sebagai string.

Saya mencari di Google dan di Stack Overflow, tetapi saya tidak dapat menemukan contoh mudah yang saya mampu dan juga saya menemukan beberapa contoh, tetapi mereka tidak berbicara tentang untuk berubah menjadi String. Maka saya perlu mentransformasikannya menjadi string untuk diunggah oleh JSON ke server jarak jauh saya.

NullPointerException
sumber

Jawaban:

331

Anda dapat menggunakan kelas Android Base64:

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

Anda harus mengubah gambar Anda menjadi array byte. Ini sebuah contoh:

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

* Perbarui *

Jika Anda menggunakan perpustakaan SDK yang lebih lama (karena Anda ingin itu berfungsi pada ponsel dengan versi OS yang lebih lama) Anda tidak akan memiliki kelas Base64 yang dikemas (karena baru saja keluar di API level 8 AKA versi 2.2).

Lihat artikel ini untuk mencari solusinya:

Cara base64 mengenkode decode Android

xil3
sumber
ok, dan mereka saya bisa meletakkan String itu (encondedImage) ke dalam kolom basis data jauh dengan PHP + JSON ???? tipe mana yang menjadi kolom basis data? VARCHAR?
NullPointerException
Nah, dengan VARCHAR Anda perlu menentukan seberapa besar itu, jadi mungkin TEKS akan lebih baik. Gambar dapat berupa berbagai ukuran ...
xil3
Hai, saya mengujinya tetapi itu memberi saya KESALAHAN di Base64. Itu tidak bisa mengacaukan kelas. Saya membuat Ctrl + shift + O untuk mendapatkan impor tetapi tidak mendapat impor ... ¿bagaimana cara mengatasinya?
NullPointerException
4
Bagi saya sedang bekerja setelah mengganti: String encodedImage = Base64.encode (byteArrayImage, Base64.DEFAULT); Oleh: String encodedImage = Base64.encodeToString (byteArrayImage, Base64.DEFAULT);
PakitoV
3
Adakah yang menyadari bahwa metode ini membuat kompresi ulang file yang tidak berarti? mengapa ini begitu dibujuk ?? Jawaban Chandra Sekhar adalah yang paling efisien.
ElYeante
103

Alih-alih menggunakan Bitmap, Anda juga bisa melakukan ini melalui hal sepele InputStream. Yah, saya tidak yakin, tapi saya pikir ini agak efisien.

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
sumber
3
Tentu ini lebih efisien; hanya mengubah file menjadi representasi base64, dan menghindari kompresi ulang gambar yang sama sekali tidak berarti.
ElYeante
Apakah fileName di sini jalur file atau nama file yang sebenarnya ??? Tolong jangan lupa memberi tag saya :) Terima kasih.
Rakeeb Rajbhandari
2
@ user2247689 Ketika Anda mencoba mengakses file jelas Anda harus memberikan path lengkap file termasuk namanya. Jika file hadir di jalur yang sama di mana program sumber Anda hadir, maka nama file sudah cukup.
Chandra Sekhar
2
Sebuah pertanyaan, apa artinya '8192' di sini, apakah itu ukuran file atau apa?
Devesh Khandelwal
1
kode ini tidak berfungsi, membuang-buang waktu saya untuk menambah masalah.
Ramkesh Yadav
7

Jika Anda memerlukan Base64 lebih dari JSON, periksa Jackson : ia memiliki dukungan eksplisit untuk data biner baca / tulis sebagai Base64 di kedua tingkat rendah (JsonParser, JsonGenerator) dan tingkat pengikatan data. Jadi Anda bisa memiliki POJO dengan properti byte [], dan pengodean / dekode ditangani secara otomatis.

Dan cukup efisien juga, seharusnya itu penting.

StaxMan
sumber
1
terlalu sulit bagi saya, kemampuan saya sangat rendah dengan ini, saya memeriksanya di google dan tidak dapat menemukan contoh mudah ... mungkin jika Anda dapat memberi saya contoh kode seperti xil3 saya akan memahaminya
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
sumber
3

Kode ini berjalan sempurna di proyek saya:

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
sumber
2

Jika Anda melakukan ini di Android , berikut ini adalah bantuan yang disalin dari basis kode Bereaksi Asli :

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
sumber
2
(akan mengalokasikan string besar dan dapat menyebabkan crash OOM) Jadi Apa solusinya dalam kasus ini?
Ibrahim Disouki
1

Berikut ini adalah kode penyandian dan pengodean ulang di 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
sumber
0
byte[] decodedString = Base64.decode(result.getBytes(), Base64.DEFAULT);
fdhchc
sumber
6
Sementara kode ini dapat menjawab pertanyaan, memberikan konteks tambahan tentang mengapa dan / atau bagaimana kode ini menjawab pertanyaan meningkatkan nilai jangka panjangnya.
Donald Duck
Penjelasan akan diurutkan.
Peter Mortensen
0

Di bawah ini adalah kodesemu yang dapat membantu Anda:

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
sumber
0

Konversi gambar ke string Base64 di 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
sumber
0

Berikut ini adalah kode untuk pengodean gambar dan pengodean gambar.

Dalam file XML

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

Dalam 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();
Asif Ali
sumber
Akankah ini benar-benar dikompilasi? Apakah Anda meninggalkan sesuatu?
Peter Mortensen
0

Bagi mereka yang mencari metode yang efisien untuk mengonversi file gambar ke string Base64 tanpa kompresi atau mengonversi file ke bitmap terlebih dahulu, Anda dapat mengkodekan file tersebut sebagai base64

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

Semoga ini membantu!

Alessi 42
sumber
-1

Gunakan kode ini:

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

Bitmap decodedByte = BitmapFactory.decodeByteArray(decodedString, 0, decodedString.length);
PJ2104
sumber
Ini justru sebaliknya
Rafael Ruiz Muñoz