मैं एक बड़े बिटमैप (फोन के कैमरे से ली गई तस्वीर) को बेस 64 स्ट्रिंग में कैसे बदलूं?
मैं एक बड़े बिटमैप (फोन के कैमरे से ली गई तस्वीर) को बेस 64 स्ट्रिंग में कैसे बदलूं?
जवाबों:
बिटमैप को बाइट सरणी में बदलने के लिए निम्नलिखित विधि का उपयोग करें:
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.PNG, 100, byteArrayOutputStream);
byte[] byteArray = byteArrayOutputStream .toByteArray();
निम्नलिखित विधि से बाइट सरणी से base64 को एनकोड करने के लिए
String encoded = Base64.encodeToString(byteArray, Base64.DEFAULT);
मेरे पास तेजी से समाधान है। बस एक फ़ाइल बनाएँ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);
जीट के उत्तर के साथ समस्या यह है कि आप छवि के सभी बाइट्स को एक बाइट सरणी में लोड करते हैं, जो संभवत: कम-अंत वाले उपकरणों में ऐप को क्रैश कर देगा। इसके बजाय, मैं सबसे पहले छवि को एक फ़ाइल में लिखूंगा और इसे 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 का उपयोग करना होगा लेकिन यह थोड़ा अधिक जटिल है क्योंकि दो स्ट्रीम हमेशा होनी चाहिए अलग-अलग धागों में हो)।
इसे आज़माएं, पहले अपनी छवि को आवश्यक चौड़ाई और ऊँचाई पर ले जाएँ, बस अपना मूल बिटमैप, आवश्यक चौड़ाई और आवश्यक ऊँचाई निम्न विधि से पास करें और बदले में बढ़ा हुआ बिटमैप प्राप्त करें:
उदाहरण के लिए: बिटमैप स्केलड बिटमैप = 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);
ये सभी उत्तर अक्षम हैं क्योंकि वे एक बिटमैप को अनावश्यक रूप से डिकोड करते हैं और फिर बिटमैप को पुनः प्राप्त करते हैं। जब आप एंड्रॉइड पर एक फोटो लेते हैं, तो यह आपके द्वारा निर्दिष्ट अस्थायी फ़ाइल में 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()
}
}
}
}
एक बोनस के रूप में, री-कंप्रेसिंग को दरकिनार करने के कारण आपकी छवि गुणवत्ता में थोड़ा सुधार होना चाहिए।
अब चूंकि अधिकांश लोग जावा के बजाय कोटलिन का उपयोग करते हैं, यहां बिटमैप को बेस 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)
}
इस कोड का उपयोग करें ..
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);
}
}