saya tidak begitu tahu apa yang Anda maksud ... Anda menggunakan FileOutputStream untuk membuat file. Dan Anda dapat menggunakan instance File (seperti dalam contoh amsiddh) untuk membuat FileOutputStream yang dapat Anda ekspor bitmapnya. Dengan itu (contoh File, file aktual pada sistem file dan FileOutputStream) Anda harus memiliki semua yang Anda butuhkan, bukan?
P. Melch
235
Semoga ini akan membantu Anda:
//create a file to write bitmap dataFile f =newFile(context.getCacheDir(), filename);
f.createNewFile();//Convert bitmap to byte arrayBitmap bitmap = your bitmap;ByteArrayOutputStream bos =newByteArrayOutputStream();
bitmap.compress(CompressFormat.PNG,0/*ignored for PNG*/, bos);byte[] bitmapdata = bos.toByteArray();//write the bytes in fileFileOutputStream fos =newFileOutputStream(f);
fos.write(bitmapdata);
fos.flush();
fos.close();
jangan lupa untuk menyiram dan menutup aliran keluaran :)
Ben Holland
3
Kode berfungsi dengan baik, tetapi metode kompres membutuhkan banyak waktu. Ada pekerjaan di sekitar?
Shail Adi
10
membuat orang bertanya-tanya apa itu metrik Kualitas. Ini adalah skala 0 rendah hingga 100, tinggi mirip dengan ekspor photoshop dll. Seperti disebutkan, ini diabaikan untuk PNG, tetapi Anda mungkin ingin menggunakannya CompressFormat.JPEG. Sesuai google doco: Petunjuk untuk kompresor, 0-100. 0 artinya kompres untuk ukuran kecil, 100 artinya kompres untuk kualitas maksimal. Beberapa format, seperti PNG yang lossless, akan mengabaikan pengaturan kualitas
wired00
3
Apakah file dari direktori cache akan dihapus secara otomatis?
Shajeel Afzal
1
Mengapa menggunakan a ByteArrayOutputStream, dapatkan array byte dari itu, lalu tulis array ke a FileOutputStream? Mengapa tidak hanya di FileOutputStreamdalam Bitmap.compress?
InsanityOnABun
39
File file =newFile("path");OutputStream os =newBufferedOutputStream(newFileOutputStream(file));
bitmap.compress(Bitmap.CompressFormat.JPEG,100, os);
os.close();
Ini memberi saya pengecualian "FileNotFound" beberapa kali. Saya masih menyelidiki mengapa ini terjadi. Juga mungkin Anda harus mempertimbangkan untuk menyimpan wile dengan ekstensi .webp yang ukurannya sekitar 40-50% lebih kecil dari JPG
Pranaysharma
Saya kira pengecualian "FileNotFound" terjadi saat menyimpan ke cache lalu entah bagaimana cache dihapus (ada banyak cara untuk menghapus cache, mungkin dengan aplikasi lain) @Pranaysharma
Mohamed Embaby
Tidak melewatkan eksekusi () setelah konstruktor: new fileFromBitmap (my_bitmap, getApplicationContext ()); ?
Andrea Leganza
1
@AndreaLeganza ya itu hilang, saya edit jawaban saya, terima kasih.
Sebagian besar jawaban terlalu panjang atau terlalu pendek tidak memenuhi tujuan. Bagi mereka yang mencari kode Java atau Kotlin untuk mengonversi bitmap ke Objek File. Berikut adalah artikel rinci yang saya tulis tentang topik tersebut. Ubah Bitmap ke File di Android
publicstaticFile bitmapToFile(Context context,Bitmap bitmap,String fileNameToSave){// File name like "image.png"//create a file to write bitmap dataFile file =null;try{
file =newFile(Environment.getExternalStorageDirectory()+File.separator + fileNameToSave);
file.createNewFile();//Convert bitmap to byte arrayByteArrayOutputStream bos =newByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.PNG,0, bos);// YOU can also save it in JPEGbyte[] bitmapdata = bos.toByteArray();//write the bytes in fileFileOutputStream fos =newFileOutputStream(file);
fos.write(bitmapdata);
fos.flush();
fos.close();return file;}catch(Exception e){
e.printStackTrace();return file;// it will return null}}
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 assetsprivate fun assetsToBitmap(fileName:String):Bitmap?{returntry{
val stream = assets.open(fileName)BitmapFactory.decodeStream(stream)}catch(e:IOException){
e.printStackTrace()null}}// Method to save an bitmap to a fileprivate fun bitmapToFile(bitmap:Bitmap):Uri{// Get the context wrapper
val wrapper =ContextWrapper(applicationContext)// Initialize a new file instance to save bitmap objectvar 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 urireturnUri.parse(file.absolutePath)}
FileOutputStream
, hanya sebuah File. Apakah ada jalan keluarnya?quality
?Semoga ini akan membantu Anda:
sumber
CompressFormat.JPEG
. Sesuai google doco: Petunjuk untuk kompresor, 0-100. 0 artinya kompres untuk ukuran kecil, 100 artinya kompres untuk kualitas maksimal. Beberapa format, seperti PNG yang lossless, akan mengabaikan pengaturan kualitasByteArrayOutputStream
, dapatkan array byte dari itu, lalu tulis array ke aFileOutputStream
? Mengapa tidak hanya diFileOutputStream
dalamBitmap.compress
?sumber
File()
konstruktor Anda .Mengubah
Bitmap
menjadiFile
perlu dilakukan di latar belakang (BUKAN DI BENANG UTAMA) itu menggantung UI khususnya jika ukurannyabitmap
besarMenyebutnya
Anda HARUS menggunakan
file
dalamonPostExecute
.Untuk mengubah direktori
file
untuk disimpan dalam baris ganti cache:dengan:
sumber
Sebagian besar jawaban terlalu panjang atau terlalu pendek tidak memenuhi tujuan. Bagi mereka yang mencari kode Java atau Kotlin untuk mengonversi bitmap ke Objek File. Berikut adalah artikel rinci yang saya tulis tentang topik tersebut. Ubah Bitmap ke File di Android
sumber
Semoga ini bisa membantu Anda
class MainActivity: AppCompatActivity () {
}
sumber