Entiendo que el uso de BitmapFactory puede convertir un Archivo de mapa de bits, pero ¿hay alguna manera de convertir una imagen de mapa de bits en un Archivo?

InformationsquelleAutor Mxyk | 2011-10-14

4 Comentarios

  1. 74

    Intente esto:

    bitmap.compress(Bitmap.CompressFormat.PNG, quality, outStream);

    Ver este

    • Pero yo no quiero un FileOutputStream, sólo un Archivo. Hay una forma de evitar esto?
    • También, ¿cuál es quality?
    • Un FileOutputStream de cómo se escribe en un archivo. Consulte developer.android.com/reference/java/io/FileOutputStream.html
    • yo realmente no sé lo que quieres decir… Que el uso de un FileOutputStream para crear un archivo. Y usted puede utilizar un Archivo de ejemplo ( como en el ejemplo de amsiddh) para crear un FileOutputStream que se puede exportar el mapa de bits. Con que ( un Archivo de ejemplo, de un archivo en el sistema de archivos y el FileOutputStream ) usted debe tener todo lo necesario, ¿no?
  2. 211

    La esperanza de que ayudará a u:

    //create a file to write bitmap data
    File f = new File(context.getCacheDir(), filename);
    f.createNewFile();
    
    //Convert bitmap to byte array
    Bitmap bitmap = your bitmap;
    ByteArrayOutputStream bos = new ByteArrayOutputStream();
    bitmap.compress(CompressFormat.PNG, 0 /*ignored for PNG*/, bos);
    byte[] bitmapdata = bos.toByteArray();
    
    //write the bytes in file
    FileOutputStream fos = new FileOutputStream(f);
    fos.write(bitmapdata);
    fos.flush();
    fos.close();
    • no te olvides de vaciar y cerrar el flujo de salida 🙂
    • El código funciona bien,pero comprimir método toma mucho tiempo. Cualquier trabajo de todo?
    • en caso que las personas se preguntan cuál es la medida de la Calidad es. La escala es de 0 baja a 100, de alta similar a la de photoshop exportación, etc. Como se mencionó, su ignorado por PNG, pero es posible que desees utilizar CompressFormat.JPEG. Según google, doco: Sugerencia para que el compresor, en escala de 0-100. 0 significa comprimir para el tamaño pequeño, 100 significado comprimir para un máximo de calidad. Algunos formatos, como PNG, que es lossless, ignorará la configuración de la calidad
    • Esto no funciona para mí. Yo estoy haciendo solo alfa y no de la foto…
    • ¿»Bos» necesita cerrarse manualmente?
    • Será el archivo desde el directorio de memoria caché se eliminarán de forma automática?
    • ¿Cuál es la ventaja de amortiguación de los bytes en la memoria antes de escribir para almacenamiento?
    • ¿Por qué utilizar un ByteArrayOutputStream, obtener una matriz de bytes que, a continuación, escribir la matriz a un FileOutputStream? ¿Por qué no la FileOutputStream en Bitmap.compress?
    • ¿qué es mapa de bits.comprimir? ¿por qué esta función dar formato PNG? y lo que es 0?

  3. 33
    File file = new File("path");
    OutputStream os = new BufferedOutputStream(new FileOutputStream(file));
    bitmap.compress(Bitmap.CompressFormat.JPEG, 100, os);
    os.close();
    • java.io.FileNotFoundException: /path: open failed: EROFS (sólo Lectura del sistema de archivos)
    • asegúrese de que usted pasa una ruta de acceso correcta para su File() constructor.
    • Tiene una ruta predeterminada?
    • la solución perfecta
    • ¿qué es mapa de bits.comprimir? ¿por qué esta función dar formato JPEG? y lo que es de 100?
    • ir a la documentación y verificación

  4. 7

    La conversión de Bitmap a File debe hacerse en el fondo (NO EN EL HILO PRINCIPAL) se cuelga la interfaz de usuario especialmente si el bitmap era grande

    File file;
    
    public class fileFromBitmap extends AsyncTask<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;
        }
    
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            //before executing doInBackground
            //update your UI
            //exp; make progressbar visible
        }
    
        @Override
        protected String doInBackground(Void... params) {
    
            ByteArrayOutputStream bytes = new ByteArrayOutputStream();
            bitmap.compress(Bitmap.CompressFormat.JPEG, 100, bytes);
            file = new File(Environment.getExternalStorageDirectory() + File.separator + "temporary_file.jpg");
            try {
                FileOutputStream fo = new FileOutputStream(file);
                fo.write(bytes.toByteArray());
                fo.flush();
                fo.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
    
            return null;
        }
    
    
        @Override
        protected void 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);
    
        }
    }

    Llamando

    new fileFromBitmap(my_bitmap, getApplicationContext()).execute();

    DEBE utilizar el file en onPostExecute .

    Para cambiar el directorio de file para ser almacenado en caché
    reemplazar la línea :

     file = new File(Environment.getExternalStorageDirectory() + File.separator + "temporary_file.jpg");

    con :

    file  = new File(context.getCacheDir(), "temporary_file.jpg");
    • Esto me da «FileNotFound» excepción de algunas veces. Todavía estoy investigando por qué sucede esto. También tal vez usted debería considerar la posibilidad de guardar la artimaña con .webp extensión de su alrededor de 40-50% menor que el tamaño JPG
    • Supongo que «FileNotFound» excepción ocurre cuando guardar en caché entonces de alguna manera se borra la caché(hay muchas maneras de obtener la caché desactivada, tal vez otra aplicación) @Pranaysharma
    • No falta el execute() después de que el constructor : nueva fileFromBitmap(my_bitmap, getApplicationContext()); ?
    • sí, lo que faltaba, he editado mi respuesta, gracias a ti.

Dejar respuesta

Please enter your comment!
Please enter your name here