Làm cách nào để chuyển đổi hình ảnh thành chuỗi Base64?


143

Mã để chuyển đổi một hình ảnh (tối đa 200 KB) thành Chuỗi Base64 là gì?

Tôi cần biết cách thực hiện với Android, vì tôi phải thêm chức năng để tải hình ảnh lên máy chủ từ xa trong ứng dụng chính của mình, đặt chúng vào một hàng cơ sở dữ liệu, dưới dạng một chuỗi.

Tôi đang tìm kiếm trong Google và trong Stack Overflow, nhưng tôi không thể tìm thấy các ví dụ dễ dàng mà tôi có thể đủ khả năng và tôi cũng tìm thấy một số ví dụ, nhưng họ không nói về việc chuyển đổi thành Chuỗi. Sau đó, tôi cần chuyển đổi thành một chuỗi để tải lên bằng JSON đến máy chủ từ xa của mình.

Câu trả lời:


330

Bạn có thể sử dụng lớp Android Base64:

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

Bạn sẽ phải chuyển đổi hình ảnh của bạn thành một mảng byte. Đây là một ví dụ:

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

* Cập nhật *

Nếu bạn đang sử dụng thư viện SDK cũ hơn (vì bạn muốn nó hoạt động trên điện thoại có phiên bản HĐH cũ hơn), bạn sẽ không có lớp Base64 được đóng gói (vì nó mới xuất hiện trong API cấp 8 AKA phiên bản 2.2).

Kiểm tra bài viết này cho một cách giải quyết:

Cách mã hóa Base64 giải mã Android


ok, và họ có thể đặt Chuỗi đó (encondedImage) vào cột cơ sở dữ liệu từ xa với PHP + JSON ???? Loại haves là cột của cơ sở dữ liệu? VARCHAR?
NullPulumException

Chà, với VARCHAR, bạn cần xác định mức độ lớn của nó, vì vậy có lẽ văn bản sẽ tốt hơn. Hình ảnh có thể là bất kỳ phạm vi kích thước nào ...
xil3

Xin chào, tôi đang thử nghiệm nó nhưng nó mang lại cho tôi LRI trong Base64. Nó không thể cho lớp học. Tôi tạo Ctrl + shift + O để nhận hàng nhập nhưng không được nhập ... làm thế nào để giải quyết?
NullPulumException

4
Đối với tôi đã làm việc sau khi thay thế: StringodingImage = Base64.encode (byteArrayImage, Base64.DEFAULT); Bởi: Chuỗi được mã hóaImage = Base64.encodeToString (byteArrayImage, Base64.DEFAULT);
PakitoV

3
Có ai nhận ra rằng phương pháp này làm cho một tập tin vô nghĩa của tập tin ?? Tại sao điều này được nâng cao ?? Câu trả lời của Chandra Sekhar là hiệu quả nhất.
ElYeante

103

Thay vì sử dụng Bitmap, bạn cũng có thể làm điều này thông qua một việc nhỏ InputStream. Chà, tôi không chắc, nhưng tôi nghĩ nó hơi hiệu quả.

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
Tất nhiên điều này là hiệu quả hơn; chỉ cần chuyển đổi một tập tin thành biểu diễn base64 của nó và tránh sự nén lại hoàn toàn vô nghĩa của hình ảnh.
ElYeante

Tên tệp ở đây là đường dẫn của tệp hoặc tên tệp thực sự ??? Xin đừng quên gắn thẻ cho tôi :) Cảm ơn.
Rakeeb Rajbhandari

2
@ user2247689 Khi bạn đang cố gắng truy cập một tệp rõ ràng bạn phải đưa ra đường dẫn đầy đủ của tệp bao gồm tên của nó. Nếu tệp hiện diện trong cùng một đường dẫn có chương trình nguồn của bạn, thì tên tệp là đủ.
Chandra Sekhar

2
Một câu hỏi, '8192' có nghĩa gì ở đây, đó là kích thước tệp hay là gì?
Devesh Khandelwal

1
mã này không hoạt động, lãng phí nhiều giờ của tôi để thêm vấn đề.
Ramkesh Yadav

7

Nếu bạn cần Base64 trên JSON, hãy xem Jackson : nó có hỗ trợ rõ ràng cho việc đọc / ghi dữ liệu nhị phân là Base64 ở cả mức thấp (JsonParser, JsonGenerator) và mức liên kết dữ liệu. Vì vậy, bạn chỉ có thể có POJO với các thuộc tính byte [] và mã hóa / giải mã được tự động xử lý.

Và cũng khá hiệu quả, nên vấn đề đó.


1
quá khó đối với tôi, kỹ năng của tôi là rất thấp với điều này, tôi kiểm tra nó trên google và không thể tìm thấy ví dụ dễ dàng ... có lẽ nếu bạn có thể cho tôi ví dụ mã như xil3 tôi sẽ hiểu nó
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

Mã này chạy hoàn hảo trong dự án của tôi:

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

Nếu bạn đang làm điều này trên Android , thì đây là một người trợ giúp được sao chép từ cơ sở mã 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
(sẽ phân bổ một chuỗi lớn và có thể gây ra sự cố OOM) Vậy giải pháp trong trường hợp này là gì?
Ibrahim Disouki

1

Đây là mã hóa và giải mã trong 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
Mặc dù mã này có thể trả lời câu hỏi, cung cấp ngữ cảnh bổ sung về lý do và / hoặc cách mã này trả lời câu hỏi cải thiện giá trị lâu dài của nó.
Vịt Donald

Một lời giải thích sẽ theo thứ tự.
Peter Mortensen

0

Dưới đây là mã giả có thể giúp bạn:

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

Chuyển đổi hình ảnh thành chuỗi Base64 trong 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

Đây là mã để mã hóa hình ảnh và giải mã hình ảnh.

Trong một tệp XML

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

Trong tệp 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();

Điều này sẽ thực sự biên dịch? Bạn đã để lại một cái gì đó?
Peter Mortensen

0

Đối với những người tìm kiếm một phương pháp hiệu quả để chuyển đổi tệp hình ảnh thành chuỗi Base64 mà không nén hoặc chuyển đổi tệp thành bitmap trước, bạn có thể mã hóa tệp dưới dạng base64

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

Hi vọng điêu nay co ich!


-1

Sử dụng mã này:

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

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

Điều này hoàn toàn ngược lại
Rafael Ruiz Muñoz
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.