IT story

이미지를 Base64 문자열로 변환하는 방법은 무엇입니까?

hot-time 2020. 6. 21. 19:26
반응형

이미지를 Base64 문자열로 변환하는 방법은 무엇입니까?


누군가 이미지 (최대 200KB)를 Base64 String으로 변환하는 코드를 말해 줄 수 있습니까?

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

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


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, 즉 버전 2.2에서 나왔기 때문에).

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

http://androidcodemonkey.blogspot.com/2010/03/how-to-base64-encode-decode-android.html


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

InputStream inputStream = new FileInputStream(fileName);//You can get an inputStream using any IO 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);

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


// 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;
}

이 코드 prefect는 내 프로젝트에서 실행됩니다.

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 base 64 string
    String imgString = Base64.encodeToString(byteFormat, Base64.NO_WRAP);

    return imgString;
}

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) {
  }
}

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)
}

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

다음은 도움이 될 수있는 의사 코드입니다.

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;
     }

안드로이드에서 이미지를 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);

압축 또는 파일을 먼저 비트 맵으로 변환하지 않고 이미지 파일을 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()
            }
      }
}

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


다음의 코드 image encodedcode에서 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 base 64 string
                String imgString = Base64.encodeToString(byteFormat, Base64.NO_WRAP);

                return imgString;
            }

            @Override
            protected void onPostExecute(String s) {
               textView5.setText(s);
            }
        }.execute();

이 코드를 사용하십시오 :

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

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

참고 URL : https://stackoverflow.com/questions/4830711/how-to-convert-a-image-into-base64-string

반응형