Bitmap'i Dosyaya Dönüştür


127

Kullanmanın BitmapFactorybir Dosyayı Bitmap'e dönüştürebileceğini anlıyorum , ancak bir Bitmap görüntüsünü Dosyaya dönüştürmenin herhangi bir yolu var mı?

Yanıtlar:


82

Bunu dene:

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

Bunu gör


10
Ama ben FileOutputStreambir dosya istemiyorum . Bunun bir yolu var mı?
Mxyk

9
Ayrıca nedir quality?
Mxyk

1
FileOutputStream, bir dosyaya nasıl yazdığınızdır. Developer.android.com/reference/java/io/FileOutputStream.html
Torid

Ne demek istediğini gerçekten bilmiyorum ... Bir dosya oluşturmak için FileOutputStream kullanıyorsun. Ve bitmap'i dışa aktarabileceğiniz bir FileOutputStream oluşturmak için bir File örneği (amsiddh örneğindeki gibi) kullanabilirsiniz. Bununla (bir Dosya örneği, dosya sistemindeki gerçek bir dosya ve FileOutputStream) ihtiyacınız olan her şeye sahip olmalısınız, değil mi?
P.Melch

235

Umarım size yardımcı olur:

//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
çıkış akışınızı temizlemeyi ve kapatmayı unutmayın :)
Ben Holland

3
Kod iyi çalışıyor, ancak sıkıştırma yöntemi çok zaman alıyor. Etrafta iş var mı?
Shail Adi

10
İnsanlar Kalite ölçütünün ne olduğunu merak etmelerine neden olur. 0'dan 100'e kadar ölçeklendirilir, photoshop dışa aktarımına benzer şekilde yüksektir. Belirtildiği gibi, PNG için göz ardı edilir, ancak kullanmak isteyebilirsiniz CompressFormat.JPEG. Google doco'ya göre: Kompresörle ilgili ipucu, 0-100. 0, küçük boyut için sıkıştır, 100, maksimum kalite için sıkıştır anlamına gelir. Kayıpsız PNG gibi bazı formatlar kalite ayarını göz ardı eder
wired00

3
Önbellek dizinindeki dosya otomatik olarak silinecek mi?
Shajeel Afzal

1
Neden a kullanıp ByteArrayOutputStream, ondan bir bayt dizisi alıp diziyi a'ya yazalım FileOutputStream? Neden sadece FileOutputStreamiçinde Bitmap.compress?
InsanityOnABun

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: / yol: açılamadı: EROFS (Salt okunur dosya sistemi)
Prasad

1
@Prasad, kurucunuza doğru bir yol geçtiğinizden emin olun File().
fraggjkee

Varsayılan bir yolu mu var?
Nathiel Barros

mükemmel çözüm
Xan

bitmap.compress nedir? neden bu işlev JPEG formatı veriyor? ve 100 nedir?
roghayeh hosseini

11

Dönüştürme Bitmapiçin Fileihtiyaçları arka (NOT YILINDA ANA İPLİK) özel olarak eğer UI asılı yapılması gereken bitmapbüyüktü

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);

    }
}

Onu çağırıyorum

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

Kullanmak MUTLAKA filein onPostExecute.

fileÖnbellekte saklanacak dizini değiştirmek için satırı değiştirin:

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

ile :

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

1
Bu bana bazen "FileNotFound" istisnası veriyor. Hala bunun neden olduğunu araştırıyorum. Ayrıca, wile'ı .webp uzantısı ile JPG'den yaklaşık% 40-50 daha küçük boyutuyla
kaydetmeyi düşünmelisiniz

Sanırım "FileNotFound" istisnası, önbelleğe kaydettikten sonra bir şekilde önbellek temizlendiğinde meydana gelir (önbelleği temizlemenin birçok yolu vardır, belki başka bir uygulama tarafından) @Pranaysharma
Mohamed Embaby

Yapıcıdan sonra execute () eksik değil: new fileFromBitmap (my_bitmap, getApplicationContext ()); ?
Andrea Leganza

1
@AndreaLeganza evet eksikti, senin sayende cevabımı düzenledim.
Mohamed Embaby

Contex'i AsyncTask'ta tutmak bellek sızıntılarına neden olabilir !!! youtube.com/watch?v=bNM_3YkK2Ws
slaviboy

2

Cevapların çoğu çok uzun veya çok kısadır ve amacı yerine getirmez. Bitmap'i Dosya Nesnesine Dönüştürmek için Java veya Kotlin kodunu arayanlar için. İşte konuyla ilgili yazdığım detaylı makale. Bitmap'i Android'de Dosyaya Dönüştür

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

Umarım bu sana yardımcı olur

class MainActivity: AppCompatActivity () {

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)
}

}

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.