Rozumiem, że za pomocą BitmapFactorymożna przekonwertować plik na mapę bitową, ale czy istnieje sposób na przekonwertowanie obrazu mapy bitowej na plik?
Naprawdę nie wiem, co masz na myśli ... Używasz FileOutputStream do tworzenia pliku. Możesz też użyć instancji File (jak w przykładzie amsiddh), aby utworzyć FileOutputStream, do którego możesz wyeksportować bitmapę. Dzięki temu (instancja File, rzeczywisty plik w systemie plików i FileOutputStream) powinieneś mieć wszystko, czego potrzebujesz, nie?
P.Melch
235
Mam nadzieję, że to ci pomoże:
//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();
nie zapomnij opróżnić i zamknąć strumienia wyjściowego :)
Ben Holland
3
Kod działa dobrze, ale metoda kompresji zajmuje dużo czasu. Jakieś obejście?
Shail Adi
10
na wypadek, gdyby ludzie zastanawiali się, czym jest wskaźnik jakości Jest to skala od 0 do 100, wysoka podobnie do eksportu w Photoshopie itp. Jak wspomniano, jest ignorowana dla PNG, ale możesz chcieć użyć CompressFormat.JPEG. Jak w google doco: wskazówka do kompresora, 0-100. 0 oznacza kompresję dla małego rozmiaru, 100 oznacza kompresję dla maksymalnej jakości. Niektóre formaty, takie jak PNG, który jest bezstratny, ignorują ustawienie jakości
wired00
3
Czy plik z katalogu pamięci podręcznej zostanie automatycznie usunięty?
Shajeel Afzal
1
Po co używać a ByteArrayOutputStream, pobrać z tego tablicę bajtów, a następnie zapisać tablicę do a FileOutputStream? Dlaczego nie tylko FileOutputStreamw Bitmap.compressśrodku?
InsanityOnABun
39
File file =newFile("path");OutputStream os =newBufferedOutputStream(newFileOutputStream(file));
bitmap.compress(Bitmap.CompressFormat.JPEG,100, os);
os.close();
Czasami powoduje to wyjątek „FileNotFound”. Nadal badam, dlaczego tak się dzieje. Również może powinieneś rozważyć zapisanie wile z rozszerzeniem .webp, który jest o około 40-50% mniejszy niż JPG
Pranaysharma
Przypuszczam, że wyjątek „FileNotFound” występuje, gdy zapisywanie w pamięci podręcznej jest w jakiś sposób czyszczone (istnieje wiele sposobów na wyczyszczenie pamięci podręcznej, może przez inną aplikację) @Pranaysharma
Mohamed Embaby
Nie brakuje execute () po konstruktorze: new fileFromBitmap (my_bitmap, getApplicationContext ()); ?
Andrea Leganza
1
@AndreaLeganza tak, brakowało, zredagowałem odpowiedź, dzięki tobie.
Większość odpowiedzi jest zbyt długich lub zbyt krótkich i nie spełnia celu. Dla tych, którzy szukają kodu Java lub Kotlin do konwersji bitmapy na obiekt pliku. Oto szczegółowy artykuł, który napisałem na ten temat. Konwertuj mapę bitową na plik w systemie 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
tylko pliku. Czy jest na to sposób?quality
?Mam nadzieję, że to ci pomoże:
źródło
CompressFormat.JPEG
. Jak w google doco: wskazówka do kompresora, 0-100. 0 oznacza kompresję dla małego rozmiaru, 100 oznacza kompresję dla maksymalnej jakości. Niektóre formaty, takie jak PNG, który jest bezstratny, ignorują ustawienie jakościByteArrayOutputStream
, pobrać z tego tablicę bajtów, a następnie zapisać tablicę do aFileOutputStream
? Dlaczego nie tylkoFileOutputStream
wBitmap.compress
środku?źródło
File()
konstruktora.Konwersja
Bitmap
doFile
musi być wykonana w tle (NIE W GŁÓWNYM NITKU), zawiesza interfejs użytkownika, szczególnie jeślibitmap
był dużyNazywam to
MUSISZ użyć pliku
file
inonPostExecute
.Aby zmienić katalog
file
do zapisania w linii zastępowania pamięci podręcznej:z :
źródło
Większość odpowiedzi jest zbyt długich lub zbyt krótkich i nie spełnia celu. Dla tych, którzy szukają kodu Java lub Kotlin do konwersji bitmapy na obiekt pliku. Oto szczegółowy artykuł, który napisałem na ten temat. Konwertuj mapę bitową na plik w systemie Android
źródło
Mam nadzieję, że to ci pomoże
class MainActivity: AppCompatActivity () {
}
źródło