বেস 64 স্ট্রিং এ অ্যান্ড্রয়েড বিটম্যাপ


128

আমি কীভাবে একটি বড় বিটম্যাপ (ফোনের ক্যামেরার সাথে তোলা ছবি) একটি বেস 64 স্ট্রিংয়ে রূপান্তর করব?


আপনি কীভাবে চিত্রটি এনকোড করতে চান?
টেড হপ্প

আপনি ভুল প্রশ্ন জিজ্ঞাসা করছেন। ফোনের ক্যামেরায় তোলা ফটোগুলি বিপি ম্যাপ নয়, জেপেইগ হিসাবে সঞ্চিত রয়েছে। আপনাকে কেবল জেপিগটি বিটম্যাপে প্রদর্শন করার উদ্দেশ্যে ডিকোড করতে হবে। আপনি যদি নীচে আমার উত্তর অনুসরণ করেন তবে আপনার কাছে কম আউট অফ মেমরি ত্রুটি এবং অযথা প্রক্রিয়াজাতকরণ থাকবে।
কারসন হলঝেইমার

উত্তর:


301

বিটম্যাপকে বাইট অ্যারেতে রূপান্তর করতে নিম্নলিখিত পদ্ধতিটি ব্যবহার করুন:

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

বাইট অ্যারে থেকে বেস 64 এনকোড করতে নিম্নলিখিত পদ্ধতিটি ব্যবহার করুন

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

সমাধানের জন্য ধন্যবাদ, আমি একই কোড ব্যবহার করেছি তবে আমার এনকোডযুক্ত স্ট্রিংটি রয়েছে ... শেষ পর্যন্ত এবং আমি মনে করি এটি সম্পূর্ণ রূপান্তরিত হয়নি তাই দয়া করে আমাকে বলুন কেন বেস 64 স্ট্রিংয়ের শেষে বিন্দু (...) ..
পঙ্কজ সিং

@ পঙ্কজ হাই আপনি কীভাবে আমাকে এই সমস্যাটি সমাধান করতে পারেন তা বলতে পারবেন, আমার এনকোডযুক্ত স্ট্রিংয়ে আমি একই সমস্যার মুখোমুখি হলাম d ডট (...) সমাধান করতে আপনি দয়া করে সহায়তা করতে পারেন
শচীন গুরানানী

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

জীটের উত্তরের সমস্যাটি হ'ল আপনি চিত্রের সমস্ত বাইটকে একটি বাইট অ্যারেতে লোড করুন, এটি সম্ভবত লো-এন্ড ডিভাইসগুলিতে অ্যাপটি ক্র্যাশ করবে। পরিবর্তে, আমি প্রথমে কোনও ফাইলে চিত্রটি লিখতে এবং এটি অ্যাপাচি এর বেস 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 স্ট্রিংটি নিজেই একটি স্ট্রিং ভেরিয়েবলের মধ্যে স্থাপন করা ভাল ধারণা নয়, কারণ, আবার এটি আউটঅফমেমরি ত্রুটির কারণ হতে পারে। তবে কমপক্ষে আমরা বাইট অ্যারে বাদ দিয়ে মেমরির খরচ অর্ধেক করে কেটেছি।

আপনি যদি কোনও ফাইলের লেখার পদক্ষেপ এড়াতে চান তবে আপনাকে আউটপুট স্ট্রিমটিকে একটি ইনপুট স্ট্রিমে রূপান্তর করতে হবে, যা এতটা সোজা নয় (আপনাকে অবশ্যই পাইপেডইনপ্রীমস্ট্রিম ব্যবহার করতে হবে তবে এটি কিছুটা জটিল যেহেতু দুটি স্ট্রিম সবসময় অবশ্যই আবশ্যক বিভিন্ন থ্রেডে থাকা)।


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 স্ট্রিং পান:

উদাহরণস্বরূপ: স্ট্রিং বেস 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);

3

অযথা বিটম্যাপে ডিকোড করা এবং তারপরে বিটম্যাপটি পুনরায় সংকোচিত করার কারণে এগুলির সমস্ত উত্তর অকার্যকর। আপনি যখন অ্যান্ড্রয়েডে কোনও ফটো তোলেন, আপনি অ্যান্ড্রয়েড ডক্স অনুসরণ করার সময় এটি নির্দিষ্ট করে দেওয়া টেম্প ফাইলটিতে একটি জেপিগ হিসাবে সংরক্ষণ করা হয় ।

আপনার যা করা উচিত তা হ'ল ফাইলটি সরাসরি একটি বেস 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);
    }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.