Entiendo que usar BitmapFactorypuede convertir un archivo en un mapa de bits, pero ¿hay alguna forma de convertir una imagen de mapa de bits en un archivo?
Realmente no sé a qué te refieres ... Usas un FileOutputStream para crear un archivo. Y puede usar una instancia de archivo (como en el ejemplo de amsiddh) para crear un FileOutputStream al que puede exportar el mapa de bits. Con eso (una instancia de archivo, un archivo real en el sistema de archivos y FileOutputStream) debería tener todo lo que necesita, ¿no?
P.Melch
235
Espero que te ayude:
//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();
no te olvides de vaciar y cerrar tu flujo de salida :)
Ben Holland
3
El código funciona bien, pero el método de compresión lleva mucho tiempo. Cualquier trabajo alrededor?
Shail Adi
10
en caso de que la gente se pregunte qué es la métrica de calidad. Es una escala de 0 bajo a 100, alta similar a la exportación de Photoshop, etc. Como se mencionó, se ignora para PNG, pero es posible que desee utilizar CompressFormat.JPEG. Según google doco: Sugerencia para el compresor, 0-100. 0 significa compresa para tamaño pequeño, 100 significa compresa para calidad máxima. Algunos formatos, como PNG que no tiene pérdidas, ignorarán la configuración de calidad
wired00
3
¿El archivo del directorio de caché se eliminará automáticamente?
Shajeel Afzal
1
¿Por qué usar a ByteArrayOutputStream, obtener una matriz de bytes de eso y luego escribir la matriz en a FileOutputStream? ¿Por qué no sólo el FileOutputStreamde Bitmap.compress?
InsanityOnABun
39
File file =newFile("path");OutputStream os =newBufferedOutputStream(newFileOutputStream(file));
bitmap.compress(Bitmap.CompressFormat.JPEG,100, os);
os.close();
Esto me da la excepción "FileNotFound" algunas veces. Todavía estoy investigando por qué sucede esto. Además, tal vez debería considerar guardar el wile con la extensión .webp, es aproximadamente un 40-50% menor que el JPG
Pranaysharma
Supongo que la excepción "FileNotFound" ocurre cuando se guarda en la memoria caché y de alguna manera se borra la memoria caché (hay muchas maneras de borrar la memoria caché, tal vez por otra aplicación) @Pranaysharma
Mohamed Embaby
No falta el execute () después del constructor: new fileFromBitmap (my_bitmap, getApplicationContext ()); ?
Andrea Leganza
1
@AndreaLeganza sí, faltaba, edité mi respuesta, gracias a ti.
La mayoría de las respuestas son demasiado largas o demasiado cortas y no cumplen el propósito. Para aquellos que buscan código Java o Kotlin para convertir mapa de bits en objeto de archivo. Aquí está el artículo detallado que he escrito sobre el tema. Convertir mapa de bits a archivo en 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
, solo un archivo. ¿Hay alguna forma de evitar esto?quality
?Espero que te ayude:
fuente
CompressFormat.JPEG
. Según google doco: Sugerencia para el compresor, 0-100. 0 significa compresa para tamaño pequeño, 100 significa compresa para calidad máxima. Algunos formatos, como PNG que no tiene pérdidas, ignorarán la configuración de calidadByteArrayOutputStream
, obtener una matriz de bytes de eso y luego escribir la matriz en aFileOutputStream
? ¿Por qué no sólo elFileOutputStream
deBitmap.compress
?fuente
File()
constructor.La conversión
Bitmap
aFile
debe hacerse en segundo plano (NO EN EL HILO PRINCIPAL) cuelga la interfaz de usuario especialmente sibitmap
era grandeLlamándolo
DEBES usar el
file
inonPostExecute
.Para cambiar el directorio
file
que se almacenará en la caché, reemplace la línea:con :
fuente
La mayoría de las respuestas son demasiado largas o demasiado cortas y no cumplen el propósito. Para aquellos que buscan código Java o Kotlin para convertir mapa de bits en objeto de archivo. Aquí está el artículo detallado que he escrito sobre el tema. Convertir mapa de bits a archivo en Android
fuente
Espero que esto te ayude
clase MainActivity: AppCompatActivity () {
}
fuente