Bir görüntüyü Base64 dizesine nasıl dönüştürebilirim?


143

Bir görüntüyü (maksimum 200 KB) Base64 Dizesi'ne dönüştürmek için kod nedir?

Android ile nasıl yapacağımı bilmeliyim, çünkü ana uygulamamdaki uzak bir sunucuya görüntü yüklemek için işlevselliği eklemeliyim, bunları dizenin bir veritabanı satırına koyarak.

Google'da ve Stack Overflow'da arama yapıyorum, ancak karşılayabileceğim kolay örnekler bulamadım ve ayrıca bazı örnekler buluyorum, ancak bir String'e dönüştürmek hakkında konuşmuyorlar. Sonra uzak sunucuma JSON tarafından yüklemek için bir dizeye dönüştürmek gerekiyor.

Yanıtlar:


331

Base64 Android sınıfını kullanabilirsiniz:

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

Resminizi bir bayt dizisine dönüştürmeniz gerekecek. İşte bir örnek:

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

* Güncelleme *

Daha eski bir SDK kitaplığı kullanıyorsanız (işletim sisteminin eski sürümlerine sahip telefonlarda çalışmasını istediğiniz için) Base64 sınıfını paketlemezsiniz (API seviye 8 AKA sürüm 2.2'de çıktığı için).

Geçici çözüm için bu makaleye göz atın:

Base64 kodlamak Android kodlamak nasıl


Tamam, ve ben bu String (encondedImage) PHP + JSON ile uzak bir veritabanı sütununa koyabilirsiniz ???? hangi tür veritabanı sütun olmak zorunda? VARCHAR?
NullPointerException

VARCHAR ile ne kadar büyük olacağını belirtmeniz gerekiyor, bu yüzden belki TEXT daha iyi olurdu. Görüntü herhangi bir boyutta olabilir ...
xil3

Merhaba, ben test ediyorum ama bana Base64 hata veriyor. Sınıfı anımsayamıyor. İthalat almak için Ctrl + shift + O yapıyorum ama ithalat alamıyorum ... ¿nasıl çözülür?
NullPointerException

4
Benim için değiştirdikten sonra çalışıyordu: String encodedImage = Base64.encode (byteArrayImage, Base64.DEFAULT); Gönderen: String encodedImage = Base64.encodeToString (byteArrayImage, Base64.DEFAULT);
PakitoV

3
Herkes bu yöntemin dosyanın anlamsız bir yeniden sıkıştırma yaptığını fark? bu neden bu kadar geçerli? Chandra Sekhar'ın cevabı en verimli olandır.
ElYeante

103

BitmapBunu kullanmak yerine, önemsiz bir yöntemle de yapabilirsiniz InputStream. Emin değilim, ama bence biraz verimli.

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
Tabii ki bu daha verimlidir; bir dosyayı base64 temsiline dönüştürür ve görüntünün kesinlikle anlamsız bir şekilde yeniden sıkıştırılmasını önler.
ElYeante

Burada fileName dosyanın yolu veya gerçek dosya adı ??? Lütfen beni etiketlemeyi unutma :) Teşekkürler.
Rakeeb Rajbhandari

2
@ user2247689 Bir dosyaya açık bir şekilde erişmeye çalıştığınızda, dosyanın adı dahil tam yolunu belirtmeniz gerekir. Dosya, kaynak programınızın bulunduğu yolun aynıysa, dosya adı yeterlidir.
Chandra Sekhar

2
Bir soru, '8192' burada ne anlama geliyor, dosya boyutu mu yoksa ne?
Devesh Khandelwal

1
bu kod çalışmıyor, sorunu addess için saatlerce harcanmış.
Ramkesh Yadav

7

JSON üzerinden Base64'e ihtiyacınız varsa, Jackson'a bakın : hem düşük düzeyde (JsonParser, JsonGenerator) hem de veri bağlama düzeyinde Base64 olarak ikili veri okuma / yazma desteği vardır. Böylece sadece byte [] özellikleri olan POJO'lara sahip olabilirsiniz ve kodlama / kod çözme otomatik olarak işlenir.

Ve bu da oldukça verimli bir şekilde.


1
benim için çok zor, benim becerileri çok düşük, ben google üzerinde kontrol ve kolay örnekler bulamıyorum ... belki bana xil3 gibi kod örnekleri verebilir eğer anlayacağım
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

Bu kod benim projemde mükemmel çalışır:

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

Bunu Android'de yapıyorsanız , React Native kod tabanından kopyalanan bir yardımcı :

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
(büyük bir dize ayıracak ve bir OOM çökmesine neden olabilir) Peki bu durumda çözüm nedir?
Ibrahim Disouki

1

İşte Kotlin kodlama ve kod çözme kodu:

 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
Bu kod soruyu cevaplayabilirken, bu kodun soruyu neden ve / veya nasıl cevapladığı konusunda ek bağlam sağlamak uzun vadeli değerini arttırır.
Donald Duck

Bir açıklama yapılabilir.
Peter Mortensen

0

Aşağıda size yardımcı olabilecek sahte kod aşağıdadır:

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

Android'de bir görüntüyü Base64 dizesine dönüştürün:

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

Görüntü kodlama ve görüntü kod çözme kodu.

XML dosyasında

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

Bir Java dosyasında:

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

Bu gerçekten derlenecek mi? Bir şey bıraktın mı?
Peter Mortensen

0

Bir görüntü dosyasını sıkıştırmadan Base64 dizesine dönüştürmek veya dosyayı önce bir bitmap'e dönüştürmek için etkili bir yöntem arayanlar için dosyayı base64 olarak kodlayabilirsiniz.

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

Bu yardımcı olur umarım!


-1

Bu kodu kullanın:

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

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

Bu tam tersi
Rafael Ruiz Muñoz
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.