मुझे एक सर्वर पर एक छवि भेजने की जरूरत है, मेरे पास 3.30 एमबी आकार की एक छवि है, मैं इसे बाइट सरणी का उपयोग करके परिवर्तित करता हूं:

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

फिर बेस 64 का उपयोग करके:

Base64.encodeToString(byteArray , Base64.DEFAULT)

संपादित करें: अगर मैं बाइट सरणी (बाइटियर) की लंबाई की जांच करता हूं तो यह 20 एमबी है! लेकिन पीसी या फोन पर आकार 3.30 एमबी दिखाता है

लौटाई गई स्ट्रिंग की लंबाई 28 एमबी है, कोई स्पष्टीकरण और समाधान?

1
Hasan Shouman 20 जुलाई 2017, 21:25

3 जवाब

सबसे बढ़िया उत्तर

आप बिटमैप को 100 और पीएनजी की गुणवत्ता के साथ संपीड़ित कर रहे हैं। इसके बजाय JPEG और 60 या 75 गुणवत्ता का उपयोग करें।

1
Pedro Varela 20 जुलाई 2017, 21:29
Bitmap bm = BitmapFactory.decodeFile("path to file");
ByteArrayOutputStream baos = new ByteArrayOutputStream();  
bm.compress(Bitmap.CompressFormat.JPEG, 100, baos); //bm is the bitmap 
object   
byte[] b = baos.toByteArray(); 
0
Talha Shahid 20 जुलाई 2017, 21:33

आप बिटमैप को गुणवत्ता 100 के साथ संपीड़ित करते हैं जिसका अर्थ है कि कोई अधिक संपीड़न नहीं है और परिणामी छवि इस पहले कोड में बड़ी है:

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

बाइटअरे यहाँ 20MB है

सामान्य है कि बेस 64 एन्कोड बाइट सरणी से बड़ा हो

बेस 64 को बाइनरी डेटा भेजने/स्टोर करने के लिए बनाया गया था जहां आप केवल टेक्स्ट भेज सकते हैं और बाइट में 256 के 64 वर्णों का उपयोग करता है या प्रत्येक बाइट्स के लिए समान 8 . के केवल 6 बिट्स का उपयोग करता है https://en.wikipedia.org/wiki/Base64

Base64.encodeToString(byteArray , Base64.DEFAULT)
0
Rolando Corratge Nieves 20 जुलाई 2017, 21:50