Ich verstehe, dass die Verwendung BitmapFactoryeine Datei in eine Bitmap konvertieren kann, aber gibt es eine Möglichkeit, ein Bitmap-Bild in eine Datei zu konvertieren?
Ich weiß nicht wirklich, was du meinst ... Du verwendest einen FileOutputStream, um eine Datei zu erstellen. Und Sie können eine Dateiinstanz (wie im Beispiel von amsiddh) verwenden, um einen FileOutputStream zu erstellen, in den Sie die Bitmap exportieren können. Damit (eine Dateiinstanz, eine tatsächliche Datei im Dateisystem und der FileOutputStream) sollten Sie alles haben, was Sie brauchen, nicht wahr?
P. Melch
235
Hoffe es wird dir helfen:
//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();
Vergessen Sie nicht, Ihren Ausgabestream zu spülen und zu schließen :)
Ben Holland
3
Code funktioniert gut, aber die Komprimierungsmethode nimmt viel Zeit in Anspruch. Irgendeine Arbeit herum?
Shail Adi
10
Falls sich die Leute fragen, was Qualitätsmetrik ist. Es ist eine Skala von 0 niedrig bis 100, hoch ähnlich wie Photoshop-Export usw. Wie bereits erwähnt, wird es für PNG ignoriert, aber Sie möchten es möglicherweise verwenden CompressFormat.JPEG. Laut Google Doco: Hinweis zum Kompressor, 0-100. 0 bedeutet Komprimierung für kleine Größe, 100 bedeutet Komprimierung für maximale Qualität. Einige Formate, wie PNG, das verlustfrei ist, ignorieren die Qualitätseinstellung
wired00
3
Wird die Datei aus dem Cache-Verzeichnis automatisch gelöscht?
Shajeel Afzal
1
Warum a verwenden ByteArrayOutputStream, daraus ein Byte-Array abrufen und dann das Array in a schreiben FileOutputStream? Warum nicht einfach das FileOutputStreamin Bitmap.compress?
InsanityOnABun
39
File file =newFile("path");OutputStream os =newBufferedOutputStream(newFileOutputStream(file));
bitmap.compress(Bitmap.CompressFormat.JPEG,100, os);
os.close();
java.io.FileNotFoundException: / path: open failed: EROFS (schreibgeschütztes Dateisystem)
Prasad
1
@Prasad stellen Sie sicher, dass Sie einen korrekten Pfad an Ihren File()Konstruktor übergeben.
fraggjkee
Es hat einen Standardpfad?
Nathiel Barros
perfekte Lösung
Xan
Was ist bitmap.compress? Warum gibt diese Funktion das JPEG-Format? und was ist 100?
Rogayeh Hosseini
11
Die Konvertierung Bitmapin Filemuss im Hintergrund erfolgen (NICHT IM HAUPTGEWINDE). Die Benutzeroberfläche hängt speziell dann, wenn die Größe bitmapgroß war
File file;publicclass fileFromBitmap extendsAsyncTask<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;}@Overrideprotectedvoid onPreExecute(){super.onPreExecute();// before executing doInBackground// update your UI// exp; make progressbar visible}@OverrideprotectedString doInBackground(Void...params){ByteArrayOutputStream bytes =newByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.JPEG,100, bytes);
file =newFile(Environment.getExternalStorageDirectory()+File.separator +"temporary_file.jpg");try{FileOutputStream fo =newFileOutputStream(file);
fo.write(bytes.toByteArray());
fo.flush();
fo.close();}catch(IOException e){
e.printStackTrace();}returnnull;}@Overrideprotectedvoid 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);}}
Ich nenne es
new fileFromBitmap(my_bitmap, getApplicationContext()).execute();
Sie müssen die filein verwenden onPostExecute.
So ändern Sie das Verzeichnis file, das im Cache gespeichert werden soll:
Dies gibt mir manchmal die Ausnahme "FileNotFound". Ich untersuche immer noch, warum dies passiert. Vielleicht sollten Sie auch in Betracht ziehen, das wile mit der .webp-Erweiterung zu speichern, die etwa 40-50% kleiner ist als JPG
Pranaysharma
Ich nehme an, dass die Ausnahme "FileNotFound" auftritt, wenn im Cache gespeichert wird und der Cache dann irgendwie gelöscht wird (es gibt viele Möglichkeiten, den Cache zu löschen, möglicherweise von einer anderen Anwendung). @Pranaysharma
Mohamed Embaby
Fehlt nicht die execute () nach dem Konstruktor: new fileFromBitmap (my_bitmap, getApplicationContext ()); ?
Andrea Leganza
1
@AndreaLeganza ja es hat gefehlt, ich habe meine Antwort dank dir bearbeitet.
Die meisten Antworten sind zu lang oder zu kurz und erfüllen den Zweck nicht. Für diejenigen, die nach Java- oder Kotlin-Code suchen, um Bitmap in Dateiobjekt zu konvertieren. Hier ist der ausführliche Artikel, den ich zu diesem Thema geschrieben habe. Konvertieren Sie Bitmap in eine Datei in 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
, nur eine Datei. Gibt es einen Weg, dies zu umgehen?quality
?Hoffe es wird dir helfen:
quelle
CompressFormat.JPEG
. Laut Google Doco: Hinweis zum Kompressor, 0-100. 0 bedeutet Komprimierung für kleine Größe, 100 bedeutet Komprimierung für maximale Qualität. Einige Formate, wie PNG, das verlustfrei ist, ignorieren die QualitätseinstellungByteArrayOutputStream
, daraus ein Byte-Array abrufen und dann das Array in a schreibenFileOutputStream
? Warum nicht einfach dasFileOutputStream
inBitmap.compress
?quelle
File()
Konstruktor übergeben.Die Konvertierung
Bitmap
inFile
muss im Hintergrund erfolgen (NICHT IM HAUPTGEWINDE). Die Benutzeroberfläche hängt speziell dann, wenn die Größebitmap
groß warIch nenne es
Sie müssen die
file
in verwendenonPostExecute
.So ändern Sie das Verzeichnis
file
, das im Cache gespeichert werden soll:mit:
quelle
Die meisten Antworten sind zu lang oder zu kurz und erfüllen den Zweck nicht. Für diejenigen, die nach Java- oder Kotlin-Code suchen, um Bitmap in Dateiobjekt zu konvertieren. Hier ist der ausführliche Artikel, den ich zu diesem Thema geschrieben habe. Konvertieren Sie Bitmap in eine Datei in Android
quelle
Hoffe das hilft dir
Klasse MainActivity: AppCompatActivity () {
}}
quelle