Base64 स्ट्रिंग के लिए एंड्रॉइड बिटमैप


128

मैं एक बड़े बिटमैप (फोन के कैमरे से ली गई तस्वीर) को बेस 64 स्ट्रिंग में कैसे बदलूं?


आप छवि को कैसे एन्कोड करना चाहते हैं?
टेड होप

आप गलत सवाल पूछ रहे हैं। फोन के कैमरे के साथ ली गई तस्वीरों को जेपीईजी के रूप में संग्रहीत किया जाता है, बिटमैप्स पर नहीं। आपको इसे प्रदर्शित करने के उद्देश्य से केवल jpeg को बिटमैप में डिकोड करने की आवश्यकता है। यदि आप नीचे दिए गए मेरे उत्तर का अनुसरण करते हैं, तो आपके पास आउटऑफ़मेरी त्रुटियां और अनावश्यक प्रसंस्करण कम होंगे।
कार्सन होल्ज़ाइमर

जवाबों:


301

बिटमैप को बाइट सरणी में बदलने के लिए निम्नलिखित विधि का उपयोग करें:

ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();  
bitmap.compress(Bitmap.CompressFormat.PNG, 100, byteArrayOutputStream);
byte[] byteArray = byteArrayOutputStream .toByteArray();

निम्नलिखित विधि से बाइट सरणी से base64 को एनकोड करने के लिए

String encoded = Base64.encodeToString(byteArray, Base64.DEFAULT);

समाधान के लिए धन्यवाद, मैंने एक ही कोड का उपयोग किया है, लेकिन मेरे एन्कोडेड स्ट्रिंग में ... अंत में है और मुझे लगता है कि यह पूरी तरह से रूपांतरित नहीं हुआ है, इसलिए कृपया मुझे बताएं कि आधार के अंत में 64 स्ट्रिंग डॉट्स (...) क्यों हैं
पंकज सिंह

@ पंकज हाय आप मुझे बता सकते हैं कि आप उस मुद्दे को कैसे सुलझाते हैं, मेरी एनकोडेड स्ट्रिंग में इसी समस्या का सामना कर रहे हैं 3 डॉट (...) यू कर सकते हैं कृपया इसे हल करने में मदद करें
सचिन गुरनानी

5
@ साचिनगर्णी - यह दिखाती है ... क्योंकि लॉगकाट सीमित स्ट्रिंग दसवीं दिखाती है और उसके बाद इसकी छंटनी की जाती है। इसीलिए।
पंकज सिंह

उर जिम्मेदारी पंकज के लिए धन्यवाद। मैंने इस मुद्दे को उसी दिन उठाया था
सचिन गुरनानी

1
क्या इसे एसिंक्टस्क में किया जाना चाहिए? या मुख्य सूत्र में ऐसा करना ठीक है?
n3wb

28

मेरे पास तेजी से समाधान है। बस एक फ़ाइल बनाएँImageUtil.java

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.util.Base64;
import java.io.ByteArrayOutputStream;

public class ImageUtil
{
    public static Bitmap convert(String base64Str) throws IllegalArgumentException
    {
        byte[] decodedBytes = Base64.decode(
            base64Str.substring(base64Str.indexOf(",")  + 1),
            Base64.DEFAULT
        );

        return BitmapFactory.decodeByteArray(decodedBytes, 0, decodedBytes.length);
    }

    public static String convert(Bitmap bitmap)
    {
        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
        bitmap.compress(Bitmap.CompressFormat.PNG, 100, outputStream);

        return Base64.encodeToString(outputStream.toByteArray(), Base64.DEFAULT);
    }

}

उपयोग:

Bitmap bitmap = ImageUtil.convert(base64String);

या

String base64String = ImageUtil.convert(bitmap);

13

जीट के उत्तर के साथ समस्या यह है कि आप छवि के सभी बाइट्स को एक बाइट सरणी में लोड करते हैं, जो संभवत: कम-अंत वाले उपकरणों में ऐप को क्रैश कर देगा। इसके बजाय, मैं सबसे पहले छवि को एक फ़ाइल में लिखूंगा और इसे Apache की Base64InputStream क्लास का उपयोग करके पढ़ूंगा । फिर आप उस फ़ाइल के InputStream से सीधे Base64 स्ट्रिंग बना सकते हैं। यह इस तरह दिखेगा:

//Don't forget the manifest permission to write files
final FileOutputStream fos = new FileOutputStream(yourFileHere); 
bitmap.compress(Bitmap.CompressFormat.PNG, 100, fos);

fos.close();

final InputStream is = new Base64InputStream( new FileInputStream(yourFileHere) );

//Now that we have the InputStream, we can read it and put it into the String
final StringWriter writer = new StringWriter();
IOUtils.copy(is , writer, encoding);
final String yourBase64String = writer.toString();

जैसा कि आप देख सकते हैं, उपरोक्त समाधान सीधे धाराओं के साथ काम करता है, सभी बाइट्स को एक चर में लोड करने की आवश्यकता से बचता है, इसलिए मेमोरी फ़ुटप्रिंट को बहुत कम बनाता है और कम-अंत डिवाइसों में क्रैश होने की संभावना कम होती है। अभी भी समस्या है कि बेस 64 स्ट्रिंग को एक स्ट्रिंग चर में डाल देना एक अच्छा विचार नहीं है, क्योंकि, फिर से, यह आउटऑफ़मेरी त्रुटियों का कारण हो सकता है। लेकिन कम से कम हमने बाइट एरे को खत्म करके मेमोरी खपत को आधे से कम कर दिया है।

यदि आप राइट-टू-फ़ाइल चरण को छोड़ना चाहते हैं, तो आपको OutputStream को एक InputStream में बदलना होगा, जो करने के लिए इतना सीधा नहीं है (आपको PipedInputStream का उपयोग करना होगा लेकिन यह थोड़ा अधिक जटिल है क्योंकि दो स्ट्रीम हमेशा होनी चाहिए अलग-अलग धागों में हो)।


2
यहाँ एन्कोडिंग क्या है?
अनिमेश मंगला

5

इसे आज़माएं, पहले अपनी छवि को आवश्यक चौड़ाई और ऊँचाई पर ले जाएँ, बस अपना मूल बिटमैप, आवश्यक चौड़ाई और आवश्यक ऊँचाई निम्न विधि से पास करें और बदले में बढ़ा हुआ बिटमैप प्राप्त करें:

उदाहरण के लिए: बिटमैप स्केलड बिटमैप = getScaledBitmap (मूल बिटमैप, 250, 350);

private Bitmap getScaledBitmap(Bitmap b, int reqWidth, int reqHeight)
{
    int bWidth = b.getWidth();
    int bHeight = b.getHeight();

    int nWidth = bWidth;
    int nHeight = bHeight;

    if(nWidth > reqWidth)
    {
        int ratio = bWidth / reqWidth;
        if(ratio > 0)
        {
            nWidth = reqWidth;
            nHeight = bHeight / ratio;
        }
    }

    if(nHeight > reqHeight)
    {
        int ratio = bHeight / reqHeight;
        if(ratio > 0)
        {
            nHeight = reqHeight;
            nWidth = bWidth / ratio;
        }
    }

    return Bitmap.createScaledBitmap(b, nWidth, nHeight, true);
}

अब बस अपने स्केल किए गए बिटमैप को निम्न विधि से पास करें और बदले में बेस 64 स्ट्रिंग प्राप्त करें:

उदाहरण के लिए: स्ट्रिंग base64String = getBase64String (scaledBitmap);

private String getBase64String(Bitmap bitmap)
{
    ByteArrayOutputStream baos = new ByteArrayOutputStream();

    bitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos);

    byte[] imageBytes = baos.toByteArray();

    String base64String = Base64.encodeToString(imageBytes, Base64.NO_WRAP);

    return base64String;
}

बेस 64 स्ट्रिंग को बिटमैप इमेज में डिकोड करने के लिए:

byte[] decodedByteArray = Base64.decode(base64String, Base64.NO_WRAP);
Bitmap decodedBitmap = BitmapFactory.decodeByteArray(decodedByteArray, 0, decodedString.length);

3

ये सभी उत्तर अक्षम हैं क्योंकि वे एक बिटमैप को अनावश्यक रूप से डिकोड करते हैं और फिर बिटमैप को पुनः प्राप्त करते हैं। जब आप एंड्रॉइड पर एक फोटो लेते हैं, तो यह आपके द्वारा निर्दिष्ट अस्थायी फ़ाइल में jpeg के रूप में संग्रहीत होता है जब आप एंड्रॉइड डॉक्स का पालन करते हैं

आपको जो करना चाहिए वह सीधे उस फाइल को बेस 64 स्ट्रिंग में बदल देता है। यहाँ है कि आसान कॉपी-पेस्ट (कोटलिन में) कैसे करें। ध्यान दें कि आपको वास्तव में अपने आंतरिक बफ़र को फ्लश करने के लिए बेस 64 फ़िल्टरस्ट्रीम को बंद करना होगा।

fun convertImageFileToBase64(imageFile: File): String {

    return FileInputStream(imageFile).use { inputStream ->
        ByteArrayOutputStream().use { outputStream ->
            Base64OutputStream(outputStream, Base64.DEFAULT).use { base64FilterStream ->
                inputStream.copyTo(base64FilterStream)
                base64FilterStream.close()
                outputStream.toString()
            }
        }
    }
}

एक बोनस के रूप में, री-कंप्रेसिंग को दरकिनार करने के कारण आपकी छवि गुणवत्ता में थोड़ा सुधार होना चाहिए।


1

अब चूंकि अधिकांश लोग जावा के बजाय कोटलिन का उपयोग करते हैं, यहां बिटमैप को बेस 64 स्ट्रिंग में परिवर्तित करने के लिए कोटलिन में कोड है।

import java.io.ByteArrayOutputStream

private fun encodeImage(bm: Bitmap): String? {
        val baos = ByteArrayOutputStream()
        bm.compress(Bitmap.CompressFormat.JPEG, 100, baos)
        val b = baos.toByteArray()
        return Base64.encodeToString(b, Base64.DEFAULT)
    }

-2

इस कोड का उपयोग करें ..

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.util.Base64;
import java.io.ByteArrayOutputStream;

public class ImageUtil 
{ 
    public static Bitmap convert(String base64Str) throws IllegalArgumentException 
    { 
        byte[] decodedBytes = Base64.decode( base64Str.substring(base64Str.indexOf(",") + 1), Base64.DEFAULT );
        return BitmapFactory.decodeByteArray(decodedBytes, 0, decodedBytes.length);
    } 

    public static String convert(Bitmap bitmap) 
    { 
        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
        bitmap.compress(Bitmap.CompressFormat.PNG, 100, outputStream);
        return Base64.encodeToString(outputStream.toByteArray(), Base64.DEFAULT);
    }
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.