이미지를 Base64 문자열로 변환하려면 어떻게해야합니까?


143

이미지 (최대 200KB)를 Base64 문자열로 변환하는 코드는 무엇입니까?

Android로 이미지를 작성하는 방법을 알아야합니다. 이미지를 기본 앱의 원격 서버에 업로드하는 기능을 추가하여 데이터베이스의 행에 문자열로 넣어야하기 때문입니다.

Google과 Stack Overflow에서 검색하고 있지만 감당할 수있는 쉬운 예제를 찾을 수 없으며 예제도 있지만 문자열로 변환하려고하지는 않습니다. 그런 다음 JSON으로 원격 서버에 업로드하려면 문자열로 변환해야합니다.

답변:


330

Base64 Android 클래스를 사용할 수 있습니다.

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

그래도 이미지를 바이트 배열로 변환해야합니다. 예를 들면 다음과 같습니다.

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

* 업데이트 *

이전 SDK 라이브러리를 사용하는 경우 (이전 버전의 OS가있는 전화기에서 작동하기 때문에) Base64 클래스는 패키지로 제공되지 않습니다 (API 레벨 8 AKA 버전 2.2에서 나왔기 때문에).

이 기사에서 해결 방법을 확인하십시오.

안드로이드 디코딩 base64 인코딩 방법


좋아, PHP (JSON +)를 사용하여 해당 문자열 (encondedImage)을 원격 데이터베이스 열에 넣을 수 있습니까? 어떤 유형이 데이터베이스의 열이어야합니까? 바차?
NullPointerException

VARCHAR을 사용하면 얼마나 큰지 지정해야하므로 TEXT가 더 좋습니다. 이미지는 모든 크기의 크기 일 수 있습니다.
xil3

안녕하세요, 테스트 중이지만 Base64에서 오류가 발생합니다. 수업을 할 수 없습니다. 수입품을 얻기 위해 Ctrl + shift + O를 만들지 만 수입품을 얻지 못합니다 ... ¿ 어떻게 해결합니까?
NullPointerException

4
나를 위해 교체 한 후 작업했습니다 : String encodeImage = Base64.encode (byteArrayImage, Base64.DEFAULT); : String encodeImage = Base64.encodeToString (byteArrayImage, Base64.DEFAULT);
PakitoV

3
아무도이 방법이 파일을 무의미하게 다시 압축한다는 것을 알고 있습니까? 왜 이렇게 공짜입니까? Chandra Sekhar의 답변이 가장 효율적입니다.
ElYeante

103

사용하는 대신 Bitmap사소한 일을 통해이를 수행 할 수도 있습니다 InputStream. 글쎄, 확실하지 않지만 조금 효율적이라고 생각합니다.

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
물론 이것은 더 효율적입니다. 파일을 base64 표현으로 변환하고 이미지의 절대 무의미한 재 압축을 피합니다.
ElYeante

여기서 fileName은 파일의 경로 또는 실제 파일 이름입니다. ??? 나를 태그하는 것을 잊지 마십시오 :) 감사합니다.
Rakeeb Rajbhandari

2
@ user2247689 파일에 액세스하려고 할 때 파일 이름을 포함하여 파일의 전체 경로를 제공해야합니다. 파일이 소스 프로그램이있는 동일한 경로에 있으면 파일 이름으로 충분합니다.
찬드라 세 카르

2
여기서 '8192'가 무엇을 의미 하는가는 파일 크기 또는 무엇입니까?
Devesh Khandelwal

1
이 코드는 작동하지 않으며 문제를 평가하기 위해 많은 시간을 낭비했습니다.
Ramkesh Yadav 19 :

7

JSON보다 Base64가 필요한 경우 Jackson을 확인하십시오. Jackson 은 하위 수준 (JsonParser, JsonGenerator) 및 데이터 바인딩 수준 모두에서 Base64로 이진 데이터 읽기 / 쓰기를 명시 적으로 지원합니다. 따라서 byte [] 속성으로 POJO 를 가질 수 있으며 인코딩 / 디코딩이 자동으로 처리됩니다.

그리고 그 문제도 매우 효율적입니다.


1
나를 위해 너무 열심히, 내 기술은 이것으로 매우 낮습니다, 나는 그것을 구글에서 확인하고 쉽게 예제를 찾을 수 없습니다 ... 어쩌면 당신이 나 xil3 같은 코드 예제를 줄 수 있다면 그것을 이해할 것입니다
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

이 코드는 내 프로젝트에서 완벽하게 실행됩니다.

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

Android 에서이 작업을 수행하는 경우 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
(큰 문자열을 할당하고 OOM 충돌을 일으킬 수 있습니다) 따라서이 경우 해결책은 무엇입니까?
이브라힘 Disouki

1

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
이 코드는 질문에 대답 할 수 있지만,이 코드가 질문에 응답하는 이유 및 / 또는 방법에 대한 추가 컨텍스트를 제공하면 장기적인 가치가 향상됩니다.
Donald Duck

순서대로 설명하겠습니다.
Peter Mortensen

0

아래는 의사 코드가 도움이 될 수 있습니다.

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에서 이미지를 Base64 문자열로 변환하십시오.

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

다음은 이미지 인코딩 및 이미지 디코딩을위한 코드입니다.

XML 파일에서

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

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

이것이 실제로 컴파일됩니까? 당신은 뭔가를 떠나나요?
Peter Mortensen

0

압축하거나 이미지를 비트 맵으로 변환하지 않고 이미지 파일을 Base64 문자열로 변환하는 효율적인 방법을 찾고있는 경우 대신 파일을 base64로 인코딩 할 수 있습니다

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

도움이 되었기를 바랍니다!


-1

이 코드를 사용하십시오 :

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

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

이것은 단지 반대입니다
라파엘 루이스 무 노즈
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.