Je ne sais pas vraiment ce que vous voulez dire ... Vous utilisez un FileOutputStream pour créer un fichier. Et vous pouvez utiliser une instance de File (comme dans l'exemple de amsiddh) pour créer un FileOutputStream vers lequel vous pouvez exporter le bitmap. Avec cela (une instance de File, un fichier réel sur le système de fichiers et FileOutputStream), vous devriez avoir tout ce dont vous avez besoin, non?
P.Melch
235
J'espère que cela vous aidera:
//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();
n'oubliez pas de rincer et de fermer votre flux de sortie :)
Ben Holland
3
Le code fonctionne bien, mais la méthode de compression prend beaucoup de temps. Un travail autour?
Shail Adi
10
au cas où les gens se demandent quelle est la métrique de qualité. Il s'agit d'une échelle de 0 à 100, élevée similaire à l'exportation de photoshop, etc. Comme mentionné, elle est ignorée pour PNG, mais vous souhaiterez peut-être l'utiliser CompressFormat.JPEG. Selon google doco: Astuce pour le compresseur, 0-100. 0 signifie compresser pour une petite taille, 100 signifie compresser pour une qualité maximale. Certains formats, comme PNG qui est sans perte,
ignoreront le
3
Le fichier du répertoire de cache sera-t-il supprimé automatiquement?
Shajeel Afzal
1
Pourquoi utiliser a ByteArrayOutputStream, obtenir un tableau d'octets à partir de cela, puis écrire le tableau dans a FileOutputStream? Pourquoi pas juste le FileOutputStreamdedans 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 (système de fichiers en lecture seule)
Prasad
1
@Prasad assurez-vous que vous passez un chemin correct à votre File()constructeur.
fraggjkee
Il a un chemin par défaut?
Nathiel Barros
solution parfaite
Xan
qu'est-ce que bitmap.compress? pourquoi cette fonction donne le format JPEG? et qu'est-ce que 100?
roghayeh hosseini
11
La conversion Bitmapen Filedoit être effectuée en arrière-plan (PAS DANS LE FIL PRINCIPAL), elle bloque l'interface utilisateur spécialement si le fichier bitmapétait grand
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);}}
L'appeler
new fileFromBitmap(my_bitmap, getApplicationContext()).execute();
vous DEVEZ utiliser le filein onPostExecute.
Pour changer de répertoire de fileà stocker dans la ligne de remplacement du cache:
Cela me donne parfois une exception "FileNotFound". J'étudie toujours pourquoi cela se produit. Vous devriez peut-être aussi envisager de sauvegarder le wile avec l'extension .webp, sa taille est environ 40 à 50% inférieure à celle de JPG
Pranaysharma
Je suppose qu'une exception "FileNotFound" se produit lorsque vous enregistrez dans le cache, puis que le cache est effacé (il existe de nombreuses façons de vider le cache, peut-être par une autre application) @Pranaysharma
Mohamed Embaby
Il ne manque pas le execute () après le constructeur: new fileFromBitmap (my_bitmap, getApplicationContext ()); ?
Andrea Leganza
1
@AndreaLeganza oui il manquait, j'ai édité ma réponse, grâce à vous.
La plupart des réponses sont trop longues ou trop courtes et ne remplissent pas l'objectif. Pour ceux qui recherchent du code Java ou Kotlin pour convertir un bitmap en objet fichier. Voici l'article détaillé que j'ai écrit sur le sujet. Convertir Bitmap en fichier sous 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
, juste un fichier. Y a-t-il un moyen de contourner ceci?quality
?J'espère que cela vous aidera:
la source
CompressFormat.JPEG
. Selon google doco: Astuce pour le compresseur, 0-100. 0 signifie compresser pour une petite taille, 100 signifie compresser pour une qualité maximale. Certains formats, comme PNG qui est sans perte,ByteArrayOutputStream
, obtenir un tableau d'octets à partir de cela, puis écrire le tableau dans aFileOutputStream
? Pourquoi pas juste leFileOutputStream
dedansBitmap.compress
?la source
File()
constructeur.La conversion
Bitmap
enFile
doit être effectuée en arrière-plan (PAS DANS LE FIL PRINCIPAL), elle bloque l'interface utilisateur spécialement si le fichierbitmap
était grandL'appeler
vous DEVEZ utiliser le
file
inonPostExecute
.Pour changer de répertoire de
file
à stocker dans la ligne de remplacement du cache:avec :
la source
La plupart des réponses sont trop longues ou trop courtes et ne remplissent pas l'objectif. Pour ceux qui recherchent du code Java ou Kotlin pour convertir un bitmap en objet fichier. Voici l'article détaillé que j'ai écrit sur le sujet. Convertir Bitmap en fichier sous Android
la source
J'espère que cela vous aide
classe MainActivity: AppCompatActivity () {
}
la source