मैं एक छवि को बेस 64 स्ट्रिंग में कैसे बदल सकता हूं?


143

बेस 64 स्ट्रिंग में एक छवि (अधिकतम 200 KB) को बदलने के लिए कोड क्या है?

मुझे यह जानने की आवश्यकता है कि इसे एंड्रॉइड के साथ कैसे किया जाए, क्योंकि मुझे अपने मुख्य ऐप में रिमोट सर्वर पर छवियों को अपलोड करने के लिए कार्यक्षमता जोड़ना है, उन्हें डेटाबेस की एक पंक्ति में एक स्ट्रिंग के रूप में डालना है।

मैं Google और स्टैक ओवरफ्लो में खोज कर रहा हूं, लेकिन मुझे ऐसे आसान उदाहरण नहीं मिल रहे हैं जो मैं बर्दाश्त कर सकूं और मुझे कुछ उदाहरण भी मिल रहे हैं, लेकिन वे एक स्ट्रिंग में बदलने की बात नहीं कर रहे हैं। फिर मुझे 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();

* अपडेट करें *

यदि आप एक पुराने एसडीके लाइब्रेरी का उपयोग कर रहे हैं (क्योंकि आप चाहते हैं कि यह ओएस के पुराने संस्करणों के साथ फोन पर काम करे) तो आपके पास बेस 64 वर्ग में पैक नहीं होगा (क्योंकि यह सिर्फ एपीआई स्तर 8 एके संस्करण 2.2 में बाहर आया था)।

वर्कअराउंड के लिए इस लेख को देखें:

बेस 64 एनकोड डिकोड एंड्रॉइड पर कैसे करें


ठीक है, और मैं उन्हें उस स्ट्रिंग (एन्कंडेडमैज) को एक दूरस्थ डेटाबेस कॉलम में PHP + JSON के साथ डाल सकता हूँ ???? जो डेटाबेस के स्तंभ होने के लिए कल्पित बौने प्रकार है? VARCHAR?
NullPointerException

खैर, VARCHAR के साथ आपको यह निर्दिष्ट करने की आवश्यकता है कि यह कितना बड़ा होगा, इसलिए शायद पाठ बेहतर होगा। चित्र आकार की कोई भी सीमा हो सकती है ...
xil3

नमस्ते, मैं यह परीक्षण कर रहा हूँ, लेकिन यह मुझे बेस 64 में ईआरओआरओआर देता है। यह वर्ग को बांध नहीं सकता। मैं आयात करने के लिए Ctrl + Shift + O बनाता हूं लेकिन आयात नहीं करता ... ¿इसे कैसे हल किया जाए?
NullPointerException

4
मेरे लिए जगह बदलने के बाद काम कर रहा था: स्ट्रिंग एन्कोडेडमैज = बेस 64.चेंद (बाइटअरेइमैज, बेस 64 डीएफआईएफएलटी); द्वारा: स्ट्रिंग encodedImage = Base64.encodeToString (byteArrayImage, Base64.DEFAULT);
15-35 बजे पाकीटो वी

3
क्या किसी को एहसास है कि यह विधि फ़ाइल का एक अर्थहीन पुन: बनाता है ?? इतना अपवित्र क्यों है ?? चंद्रशेखर का जवाब सबसे कुशल है।
एलियनट

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
बेशक यह अधिक कुशल है; बस एक फाइल को उसके बेस 64 प्रतिनिधित्व में बदल देता है, और छवि के बिल्कुल निरर्थक पुनरावृत्ति से बचा जाता है।
एलियनट

क्या फ़ाइलनाम यहाँ फ़ाइल का पथ या वास्तविक फ़ाइल नाम है ??? कृपया मुझे टैग करना न भूलें :) धन्यवाद।
राकेब राजभँदरी

2
@ user2247689 जब आप किसी फ़ाइल तक पहुँचने की कोशिश कर रहे हैं, तो जाहिर है कि आपको उसके नाम सहित फ़ाइल का पूरा रास्ता देना होगा। यदि फ़ाइल उसी पथ पर मौजूद है जहाँ आपका स्रोत प्रोग्राम मौजूद है, तो फ़ाइल नाम ही पर्याप्त है।
चंद्रशेखर

2
एक प्रश्न, '8192' यहाँ क्या दर्शाता है, क्या यह फ़ाइल का आकार है या क्या है?
देवेश खंडेलवाल

1
यह कोड काम नहीं कर रहा है, इस मुद्दे को जोड़ने के लिए मेरे कई घंटे बर्बाद कर दिए।
रामकेश यादव

7

यदि आपको JSON पर Base64 की आवश्यकता है, तो जैक्सन देखें : इसमें निम्न स्तर (JsonParser, JsonGenerator) और डेटा-बाइंडिंग स्तर दोनों पर Base64 के रूप में बाइनरी डेटा पढ़ने / लिखने के लिए स्पष्ट समर्थन है। तो आप बस बाइट [] गुणों के साथ POJOs हो सकते हैं, और एन्कोडिंग / डिकोडिंग स्वचालित रूप से नियंत्रित किया जाता है।

और बहुत कुशलता से भी, यह बात चाहिए।


1
मेरे लिए बहुत मुश्किल है, मेरे कौशल इसके साथ बहुत कम हैं, मैंने इसे Google पर जांचा और आसान उदाहरण नहीं खोज सकता ... शायद अगर आप मुझे 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 पर ऐसा कर रहे हैं , तो यहां प्रतिक्रियाशील मूल कोडबेस से कॉपी किया गया एक सहायक है :

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 दुर्घटना का कारण बन सकता है) तो इस मामले में समाधान क्या है?
इब्राहिम दिसूकी

1

यहाँ कोडिन में एन्कोडिंग और डिकोडिंग कोड है:

 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
हालांकि यह कोड प्रश्न का उत्तर दे सकता है, लेकिन यह कोड क्यों और / या इस प्रश्न के उत्तर के बारे में अतिरिक्त संदर्भ प्रदान करता है, इसके दीर्घकालिक मूल्य में सुधार करता है।
डोनाल्ड डक

एक स्पष्टीकरण क्रम में होगा।
पीटर मोर्टेंसन

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"
/>

जावा फ़ाइल में:

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

क्या यह वास्तव में संकलन करेगा? क्या आपने कुछ छोड़ा?
पीटर मोर्टेंसन

0

बिना किसी संपीड़न के किसी इमेज फाइल को बेस 64 स्ट्रिंग में बदलने या पहले बिटमैप में फाइल को कनवर्ट करने की कुशल विधि की तलाश करने वालों के लिए, आप फाइल को बेस 64 के रूप में एनकोड कर सकते हैं।

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

उम्मीद है की यह मदद करेगा!


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.