আমি কীভাবে একটি বড় বিটম্যাপ (ফোনের ক্যামেরার সাথে তোলা ছবি) একটি বেস 64 স্ট্রিংয়ে রূপান্তর করব?
আমি কীভাবে একটি বড় বিটম্যাপ (ফোনের ক্যামেরার সাথে তোলা ছবি) একটি বেস 64 স্ট্রিংয়ে রূপান্তর করব?
উত্তর:
বিটম্যাপকে বাইট অ্যারেতে রূপান্তর করতে নিম্নলিখিত পদ্ধতিটি ব্যবহার করুন:
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.PNG, 100, byteArrayOutputStream);
byte[] byteArray = byteArrayOutputStream .toByteArray();
বাইট অ্যারে থেকে বেস 64 এনকোড করতে নিম্নলিখিত পদ্ধতিটি ব্যবহার করুন
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);
জীটের উত্তরের সমস্যাটি হ'ল আপনি চিত্রের সমস্ত বাইটকে একটি বাইট অ্যারেতে লোড করুন, এটি সম্ভবত লো-এন্ড ডিভাইসগুলিতে অ্যাপটি ক্র্যাশ করবে। পরিবর্তে, আমি প্রথমে কোনও ফাইলে চিত্রটি লিখতে এবং এটি অ্যাপাচি এর বেস 64 ইনপুটস্ট্রিম ক্লাসটি ব্যবহার করে পড়তে চাই । তারপরে আপনি সেই ফাইলের ইনপুটস্ট্রিম থেকে সরাসরি বেস 64 স্ট্রিং তৈরি করতে পারেন। এটি দেখতে এটির মতো হবে:
//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 স্ট্রিংটি নিজেই একটি স্ট্রিং ভেরিয়েবলের মধ্যে স্থাপন করা ভাল ধারণা নয়, কারণ, আবার এটি আউটঅফমেমরি ত্রুটির কারণ হতে পারে। তবে কমপক্ষে আমরা বাইট অ্যারে বাদ দিয়ে মেমরির খরচ অর্ধেক করে কেটেছি।
আপনি যদি কোনও ফাইলের লেখার পদক্ষেপ এড়াতে চান তবে আপনাকে আউটপুট স্ট্রিমটিকে একটি ইনপুট স্ট্রিমে রূপান্তর করতে হবে, যা এতটা সোজা নয় (আপনাকে অবশ্যই পাইপেডইনপ্রীমস্ট্রিম ব্যবহার করতে হবে তবে এটি কিছুটা জটিল যেহেতু দুটি স্ট্রিম সবসময় অবশ্যই আবশ্যক বিভিন্ন থ্রেডে থাকা)।
এটি ব্যবহার করে প্রথমে আপনার চিত্রটি প্রয়োজনীয় প্রস্থ এবং উচ্চতায় স্কেল করুন, কেবলমাত্র আপনার আসল বিটম্যাপ, প্রয়োজনীয় প্রস্থ এবং প্রয়োজনীয় উচ্চতাটি নিম্নলিখিত পদ্ধতিতে পাস করুন এবং এর বিনিময়ে স্কেল বিটম্যাপটি পান:
উদাহরণস্বরূপ: বিটম্যাপ স্কেলডবিটম্যাপ = 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 স্ট্রিং পান:
উদাহরণস্বরূপ: স্ট্রিং বেস 64 স্ট্রিং = getBase64String (স্কেলবিটম্যাপ);
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);
অযথা বিটম্যাপে ডিকোড করা এবং তারপরে বিটম্যাপটি পুনরায় সংকোচিত করার কারণে এগুলির সমস্ত উত্তর অকার্যকর। আপনি যখন অ্যান্ড্রয়েডে কোনও ফটো তোলেন, আপনি অ্যান্ড্রয়েড ডক্স অনুসরণ করার সময় এটি নির্দিষ্ট করে দেওয়া টেম্প ফাইলটিতে একটি জেপিগ হিসাবে সংরক্ষণ করা হয় ।
আপনার যা করা উচিত তা হ'ল ফাইলটি সরাসরি একটি বেস 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);
}
}