android - vectorial - ventajas de los mapa de bits




Guardar mapa de bits en la ubicación (11)

¿Por qué no llamar al método Bitmap.compress con 100 (lo que parece que no tiene pérdidas)?

Estoy trabajando en una función para descargar una imagen de un servidor web, mostrarla en la pantalla y, si el usuario desea guardar la imagen, guárdela en la tarjeta SD en una carpeta determinada. ¿Hay una manera fácil de tomar un mapa de bits y simplemente guardarlo en la tarjeta SD en una carpeta de mi elección?

Mi problema es que puedo descargar la imagen, mostrarla en pantalla como un mapa de bits. La única forma en que he podido encontrar para guardar una imagen en una carpeta en particular es usar FileOutputStream, pero eso requiere una matriz de bytes. No estoy seguro de cómo convertir (si esta es la forma correcta) de Bitmap a byte array, por lo que puedo usar un FileOutputStream para escribir los datos.

La otra opción que tengo es usar MediaStore:

MediaStore.Images.Media.insertImage(getContentResolver(), bm,
    barcodeNumber + ".jpg Card Image", barcodeNumber + ".jpg Card Image");

Lo que funciona bien para guardar en la tarjeta SD, pero no le permite personalizar la carpeta.


// | == | Crea un archivo PNG desde Bitmap:

void devImjFylFnc(String pthAndFylTtlVar, Bitmap iptBmjVar)
{
    try
    {
        FileOutputStream fylBytWrtrVar = new FileOutputStream(pthAndFylTtlVar);
        iptBmjVar.compress(Bitmap.CompressFormat.PNG, 100, fylBytWrtrVar);
        fylBytWrtrVar.close();
    }
    catch (Exception errVar) { errVar.printStackTrace(); }
}

// | == | Obtener Bimap desde el archivo:

Bitmap getBmjFrmFylFnc(String pthAndFylTtlVar)
{
    return BitmapFactory.decodeFile(pthAndFylTtlVar);
}

Aquí está el código de ejemplo para guardar el mapa de bits en el archivo:

public static File savebitmap(Bitmap bmp) throws IOException {
    ByteArrayOutputStream bytes = new ByteArrayOutputStream();
    bmp.compress(Bitmap.CompressFormat.JPEG, 60, bytes);
    File f = new File(Environment.getExternalStorageDirectory()
            + File.separator + "testimage.jpg");
    f.createNewFile();
    FileOutputStream fo = new FileOutputStream(f);
    fo.write(bytes.toByteArray());
    fo.close();
    return f;
}

Ahora llame a esta función para guardar el mapa de bits en la memoria interna.

File newfile = savebitmap(bitmap) ;

Espero que te ayude. Feliz vida codificadora.


Asegúrese de que el directorio esté creado antes de llamar a bitmap.compress :

new File(FileName.substring(0,FileName.lastIndexOf("/"))).mkdirs();

Debe usar el método Bitmap.compress() para guardar un mapa de bits como un archivo. Comprimirá (si el formato utilizado lo permite) su imagen y la insertará en un OutputStream.

Aquí hay un ejemplo de una instancia de Bitmap obtenida a través de getImageBitmap(myurl) que se puede comprimir como un JPEG con una tasa de compresión del 85%:

// Assume block needs to be inside a Try/Catch block.
String path = Environment.getExternalStorageDirectory().toString();
OutputStream fOut = null;
Integer counter = 0;
File file = new File(path, "FitnessGirl"+counter+".jpg"); // the File to save , append increasing numeric counter to prevent files from getting overwritten.
fOut = new FileOutputStream(file);

Bitmap pictureBitmap = getImageBitmap(myurl); // obtaining the Bitmap
pictureBitmap.compress(Bitmap.CompressFormat.JPEG, 85, fOut); // saving the Bitmap to a file compressed as a JPEG with 85% compression rate
fOut.flush(); // Not really required
fOut.close(); // do not forget to close the stream

MediaStore.Images.Media.insertImage(getContentResolver(),file.getAbsolutePath(),file.getName(),file.getName());

Dentro de onActivityResult :

String filename = "pippo.png";
File sd = Environment.getExternalStorageDirectory();
File dest = new File(sd, filename);

Bitmap bitmap = (Bitmap)data.getExtras().get("data");
try {
     FileOutputStream out = new FileOutputStream(dest);
     bitmap.compress(Bitmap.CompressFormat.PNG, 90, out);
     out.flush();
     out.close();
} catch (Exception e) {
     e.printStackTrace();
}

En realidad no es una respuesta, sino un comentario. Estoy en una Mac ejecutando el entorno del emulador y obtengo una excepción java.io.IOException: Permiso denegado - error con este código:

protected void onActivityResult(int requestCode, int resultCode, Intent imageReturnedIntent) {
    Log.d("DEBUG", "onActivityResult called");
    super.onActivityResult(requestCode, resultCode, imageReturnedIntent);
    if(requestCode == 0 && resultCode == RESULT_OK) {
        Log.d("DEBUG", "result is ok");
        try{
            Bitmap map = (Bitmap) imageReturnedIntent.getExtras().get("data");
            File sd = new File(Environment.getExternalStorageDirectory(), "test.png");
            sd.mkdirs();
            sd.createNewFile();
            FileOutputStream out = new FileOutputStream(sd);
            map.compress(Bitmap.CompressFormat.PNG, 90, out);
            out.flush();
            out.close();
        } catch(FileNotFoundException e){
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

También agregué use-permission android.permission.WRITE_EXTERNAL_STORAGE al archivo de manifiesto (como lo anotaron otros).


Hey solo dale el nombre a .bmp

Hacer esto:

ByteArrayOutputStream bytes = new ByteArrayOutputStream();
_bitmapScaled.compress(Bitmap.CompressFormat.PNG, 40, bytes);

//you can create a new file name "test.BMP" in sdcard folder.
File f = new File(Environment.getExternalStorageDirectory()
                        + File.separator + "**test.bmp**")

Sonará como si solo hubiera perdido el tiempo pero inténtelo una vez que se guardará en bmp foramt..Cheers


También me gustaría guardar una foto. Pero mi problema (?) Es que quiero guardarlo de un mapa de bits que he dibujado.

Lo hice así:

 @Override
 public boolean onOptionsItemSelected(MenuItem item) {
            switch (item.getItemId()) {
            case R.id.save_sign:      

                myView.save();
                break;

            }
            return false;    

    }

public void save() {
            String filename;
            Date date = new Date(0);
            SimpleDateFormat sdf = new SimpleDateFormat ("yyyyMMddHHmmss");
            filename =  sdf.format(date);

            try{
                 String path = Environment.getExternalStorageDirectory().toString();
                 OutputStream fOut = null;
                 File file = new File(path, "/DCIM/Signatures/"+filename+".jpg");
                 fOut = new FileOutputStream(file);

                 mBitmap.compress(Bitmap.CompressFormat.JPEG, 85, fOut);
                 fOut.flush();
                 fOut.close();

                 MediaStore.Images.Media.insertImage(getContentResolver()
                 ,file.getAbsolutePath(),file.getName(),file.getName());

            }catch (Exception e) {
                e.printStackTrace();
            }

 }

Bitmap bbicon;

bbicon=BitmapFactory.decodeResource(getResources(),R.drawable.bannerd10);
//ByteArrayOutputStream baosicon = new ByteArrayOutputStream();
//bbicon.compress(Bitmap.CompressFormat.PNG,0, baosicon);
//bicon=baosicon.toByteArray();

String extStorageDirectory = Environment.getExternalStorageDirectory().toString();
OutputStream outStream = null;
File file = new File(extStorageDirectory, "er.PNG");
try {
    outStream = new FileOutputStream(file);
    bbicon.compress(Bitmap.CompressFormat.PNG, 100, outStream);
    outStream.flush();
    outStream.close();
} catch(Exception e) {

}

try (FileOutputStream out = new FileOutputStream(filename)) {
    bmp.compress(Bitmap.CompressFormat.PNG, 100, out); // bmp is your Bitmap instance
    // PNG is a lossless format, the compression factor (100) is ignored
} catch (IOException e) {
    e.printStackTrace();
}




save