বিটম্যাপকে ফাইলে রূপান্তর করুন


127

আমি বুঝতে পারি যে ব্যবহার করে BitmapFactoryকোনও ফাইলকে বিটম্যাপে রূপান্তর করতে পারে, তবে বিটম্যাপ চিত্রকে কোনও ফাইলে রূপান্তর করার কোনও উপায় আছে কি?

উত্তর:


82

এটা চেষ্টা কর:

bitmap.compress(Bitmap.CompressFormat.PNG, quality, outStream);

এটা দেখ


10
তবে আমি একটি FileOutputStream, কেবল একটি ফাইল চাই না । এই সমস্যা এড়ানোর একটি উপায় আছে কি?
ম্যাক্সেক

9
এছাড়াও, কি quality?
ম্যাকিক 16

1
একটি ফাইলআউটপুট স্ট্রিম হ'ল আপনি কীভাবে কোনও ফাইলে লেখেন। বিকাশকারী.অ্যান্ড্রয়েড.
com

আমি আসলে কী বলতে চাই তা আমি জানি না ... আপনি একটি ফাইল তৈরি করতে একটি ফাইলআউটপুট স্ট্রিম ব্যবহার করেন। এবং আপনি একটি বিটম্যাপটি রফতানি করতে পারবেন এমন একটি ফাইলআউটপুট স্ট্রিম তৈরি করতে কোনও ফাইল উদাহরণ (যেমন অমসিদ্ধের উদাহরণে) ব্যবহার করতে পারেন। এটির সাথে (একটি ফাইল উদাহরণ, ফাইল সিস্টেম এবং ফাইলআউটপুট স্ট্রিমের একটি আসল ফাইল) আপনার যা কিছু দরকার তা থাকা উচিত, না?
P.Melch

235

আশা করি এটি আপনাকে সহায়তা করবে:

//create a file to write bitmap data
File f = new File(context.getCacheDir(), filename);
f.createNewFile();

//Convert bitmap to byte array
Bitmap bitmap = your bitmap;
ByteArrayOutputStream bos = new ByteArrayOutputStream();
bitmap.compress(CompressFormat.PNG, 0 /*ignored for PNG*/, bos);
byte[] bitmapdata = bos.toByteArray();

//write the bytes in file
FileOutputStream fos = new FileOutputStream(f);
fos.write(bitmapdata);
fos.flush();
fos.close();

36
আপনার আউটপুট স্ট্রিমটি ফ্লাশ এবং বন্ধ করতে ভুলবেন না :)
বেন হল্যান্ড

3
কোড সূক্ষ্মভাবে কাজ করে, তবে সংক্ষেপণ পদ্ধতিতে অনেক সময় লাগে। আশেপাশে কোন কাজ?
শাইল আদি

10
যদি লোকেরা ভাবছে যে কোয়ালিটি মেট্রিক কী। এটি 0 কম থেকে 100 এর স্কেল, ফটোশপ রফতানির মতো উচ্চতার মতো etc. যেমনটি উল্লিখিত রয়েছে, এটি পিএনজির জন্য উপেক্ষা করা হয়েছে তবে আপনি ব্যবহার করতে ইচ্ছুক হতে পারেন CompressFormat.JPEG। গুগল ডকো অনুসারে: সংকোচকারীকে ইঙ্গিত, 0-100। 0 ছোট আকারের জন্য সংকোচনের অর্থ, সর্বাধিক মানের জন্য সংকোচনের 100 টি। পিএনজির মতো কিছু ফর্ম্যাট যা
ক্ষতিহীন

3
ক্যাশে ডিরেক্টরি থেকে ফাইলটি কী স্বয়ংক্রিয়ভাবে মুছে ফেলা হবে?
শাজিল আফজাল

1
কেন একটি ব্যবহার করবেন ByteArrayOutputStream, সেখান থেকে বাইট অ্যারে পাবেন, তারপরে অ্যারে লিখবেন FileOutputStream? শুধু FileOutputStreamভিতরে না কেন Bitmap.compress?
উন্মাদনাববুন

39
File file = new File("path");
OutputStream os = new BufferedOutputStream(new FileOutputStream(file));
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, os);
os.close();

java.io.FileNotFoundException: / path: ওপেন ব্যর্থ হয়েছে: EROFS (কেবল পঠনযোগ্য ফাইল সিস্টেম)
প্রসাদ

1
@ প্রসাদ নিশ্চিত হন যে আপনি আপনার নির্মাতাকে একটি সঠিক পথ দিয়ে গেছেন File()
ভঙ্গুজকি

এটি একটি ডিফল্ট পাথ আছে?
নাথিয়েল ব্যারোস

নিখুঁত সমাধান
Xan

বিটম্যাপ.কম কী? কেন এই ফাংশনটি জেপিজি ফর্ম্যাট দেয়? এবং 100 কি?
রোঘেহে হোসেইনি

11

রূপান্তর Bitmapকরার Fileচাহিদা পটভূমি (না দ্য মূল থ্রেড) এটি UI 'তে বিশেষভাবে যদি হ্যাং মধ্যে সম্পন্ন করা bitmapবড় ছিল

File file;

public class fileFromBitmap extends AsyncTask<Void, Integer, String> {

    Context context;
    Bitmap bitmap;
    String path_external = Environment.getExternalStorageDirectory() + File.separator + "temporary_file.jpg";

    public fileFromBitmap(Bitmap bitmap, Context context) {
        this.bitmap = bitmap;
        this.context= context;
    }

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        // before executing doInBackground
        // update your UI
        // exp; make progressbar visible
    }

    @Override
    protected String doInBackground(Void... params) {

        ByteArrayOutputStream bytes = new ByteArrayOutputStream();
        bitmap.compress(Bitmap.CompressFormat.JPEG, 100, bytes);
        file = new File(Environment.getExternalStorageDirectory() + File.separator + "temporary_file.jpg");
        try {
            FileOutputStream fo = new FileOutputStream(file);
            fo.write(bytes.toByteArray());
            fo.flush();
            fo.close();
        } catch (IOException e) {
            e.printStackTrace();
        }

        return null;
    }


    @Override
    protected void onPostExecute(String s) {
        super.onPostExecute(s);
        // back to main thread after finishing doInBackground
        // update your UI or take action after
        // exp; make progressbar gone

         sendFile(file);

    }
}

ডাকছে

new fileFromBitmap(my_bitmap, getApplicationContext()).execute();

আপনি ব্যবহার করা আবশ্যক fileমধ্যে onPostExecute

fileক্যাশে স্থানান্তরিত রেখার ডিরেক্টরি পরিবর্তন করতে :

 file = new File(Environment.getExternalStorageDirectory() + File.separator + "temporary_file.jpg");

সঙ্গে :

file  = new File(context.getCacheDir(), "temporary_file.jpg");

1
এটি আমাকে "ফাইলনটফাউন্ড" ব্যতিক্রম কিছু সময় দেয়। আমি এখনও তদন্ত করছি কেন এটি ঘটে। এছাড়াও হয়ত আপনার ডাবলিকে .Wbp এক্সটেনশনের সাহায্যে জেপিজির চেয়ে প্রায় 40-50% কম আকারের সাথে বাঁচাতে বিবেচনা করা উচিত
প্রাণায়র্মা

আমি মনে করি ক্যাশে সংরক্ষণের সময় "ফাইলনটফাউন্ড" ব্যতিক্রম ঘটে তবে কোনওরকম ক্যাশে সাফ হয়ে যায় (ক্যাশে সাফ করার অনেক উপায় রয়েছে, সম্ভবত অন্য কোনও অ্যাপ্লিকেশন দ্বারা) @ প্রাণেশর্মা
মোহাম্মদ এমবাবি

কনস্ট্রাক্টরের পরে এক্সিকিউটিউট () অনুপস্থিত: নতুন ফাইলফ্র্যামবিটম্যাপ (my_bitmap, getApplicationContext ()); ?
আন্দ্রেয়া লেগানজা

1
@ আন্ড্রেলেগানজা হ্যাঁ এটি অনুপস্থিত ছিল, আমি আমার উত্তর সম্পাদনা করেছি, আপনাকে ধন্যবাদ।
মোহাম্মদ এম্বেবি

অ্যাসিঙ্কটাস্কে কনটেক্স রেখে দিলে স্মৃতি ফাঁস হতে পারে !!! youtube.com/watch?v=bNM_3YkK2Ws
স্লাভবয়

2

উত্তরগুলির বেশিরভাগই দীর্ঘায়িত বা খুব সংক্ষিপ্তরূপে উদ্দেশ্যটি পূরণ করে না। যাঁরা জাভা বা কোটলিন কোড খুঁজছেন তাদের বিটম্যাপে ফাইল অবজেক্টে রূপান্তর করতে। আমি এই বিষয়ের উপর লিখেছি বিস্তারিত নিবন্ধ এখানে। বিটম্যাপকে অ্যান্ড্রয়েডে ফাইলে রূপান্তর করুন

public static File bitmapToFile(Context context,Bitmap bitmap, String fileNameToSave) { // File name like "image.png"
        //create a file to write bitmap data
        File file = null;
        try {
            file = new File(Environment.getExternalStorageDirectory() + File.separator + fileNameToSave);
            file.createNewFile();

//Convert bitmap to byte array
            ByteArrayOutputStream bos = new ByteArrayOutputStream();
            bitmap.compress(Bitmap.CompressFormat.PNG, 0 , bos); // YOU can also save it in JPEG
            byte[] bitmapdata = bos.toByteArray();

//write the bytes in file
            FileOutputStream fos = new FileOutputStream(file);
            fos.write(bitmapdata);
            fos.flush();
            fos.close();
            return file;
        }catch (Exception e){
            e.printStackTrace();
            return file; // it will return null
        }
    }

0

আশা করি এটি আপনাকে সাহায্য করবে

ক্লাসের মূল কার্যকলাপ: অ্যাপকম্প্যাটঅ্যাক্টিভিটি () {

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    // Get the bitmap from assets and display into image view
    val bitmap = assetsToBitmap("tulip.jpg")
    // If bitmap is not null
    bitmap?.let {
        image_view_bitmap.setImageBitmap(bitmap)
    }


    // Click listener for button widget
    button.setOnClickListener{
        if(bitmap!=null){
            // Save the bitmap to a file and display it into image view
            val uri = bitmapToFile(bitmap)
            image_view_file.setImageURI(uri)

            // Display the saved bitmap's uri in text view
            text_view.text = uri.toString()

            // Show a toast message
            toast("Bitmap saved in a file.")
        }else{
            toast("bitmap not found.")
        }
    }
}


// Method to get a bitmap from assets
private fun assetsToBitmap(fileName:String):Bitmap?{
    return try{
        val stream = assets.open(fileName)
        BitmapFactory.decodeStream(stream)
    }catch (e:IOException){
        e.printStackTrace()
        null
    }
}


// Method to save an bitmap to a file
private fun bitmapToFile(bitmap:Bitmap): Uri {
    // Get the context wrapper
    val wrapper = ContextWrapper(applicationContext)

    // Initialize a new file instance to save bitmap object
    var file = wrapper.getDir("Images",Context.MODE_PRIVATE)
    file = File(file,"${UUID.randomUUID()}.jpg")

    try{
        // Compress the bitmap and save in jpg format
        val stream:OutputStream = FileOutputStream(file)
        bitmap.compress(Bitmap.CompressFormat.JPEG,100,stream)
        stream.flush()
        stream.close()
    }catch (e:IOException){
        e.printStackTrace()
    }

    // Return the saved bitmap uri
    return Uri.parse(file.absolutePath)
}

}

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.