Uložit bitovou mapu k umístění

hlasů
395

Pracuji na funkci stáhnout obrázek z webového serveru, zobrazit ji na obrazovce, a pokud si uživatel přeje, aby obraz, uložte ho na SD kartě v určité složce. Existuje jednoduchý způsob, jak vzít bitmapy a stačí ji uložit na SD kartu do složky podle vlastního výběru?

Můj problém je, že jsem si stáhnout obraz zobrazit na obrazovce jako bitmapu. Jediný způsob, jak jsem byl schopen najít uložit obrázek do určité složky je použití FileOutputStream, ale to vyžaduje bajtové pole. Nejsem si jistý, jak převést (pokud to je ještě ta správná cesta) od Bitmap do bytového pole, takže můžu použít FileOutputStream pro zápis dat.

Druhou možností musím je použít MediaStore:

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

Který funguje uložit na SD kartu, ale neumožňuje přizpůsobit složku.

Položena 16/03/2009 v 04:26
zdroj uživatelem
V jiných jazycích...                            


19 odpovědí

hlasů
8

Proč ne volat Bitmap.compressmetodu s 100 (což zní jako je bezztrátový)?

Odpovězeno 16/03/2009 v 05:10
zdroj uživatelem

hlasů
810

FileOutputStream out = null;
try {
    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 (Exception e) {
    e.printStackTrace();
} finally {
    try {
        if (out != null) {
            out.close();
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
}
Odpovězeno 23/03/2009 v 12:22
zdroj uživatelem

hlasů
13

Některé formáty, jako PNG, který je bezztrátový, bude ignorovat nastavení kvality.

Odpovězeno 09/12/2009 v 14:53
zdroj uživatelem

hlasů
121

Měli byste použít Bitmap.compress()metodu uložit rastr jako soubor. Bude komprimovat (pokud je formát používaný to dovolí) svůj obrázek a zatlačte ji do OutputStream.

Zde je příklad Bitmap instance získaného getImageBitmap(myurl), která může být stlačena ve formátu JPEG s kompresním poměrem 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());
Odpovězeno 10/06/2010 v 11:42
zdroj uživatelem

hlasů
6

Rád bych také uložit obrázek. Ale můj problém (?) Je, že chci, aby ji zachránil před bitmapy, která Ive načrtl.

Udělal jsem to takhle:

 @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();
            }

 }
Odpovězeno 18/11/2010 v 10:26
zdroj uživatelem

hlasů
8
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) {

}
Odpovězeno 22/06/2011 v 10:25
zdroj uživatelem

hlasů
34
outStream = new FileOutputStream(file);

bude hodit výjimku bez dovolení AndroidManifest.xml (alespoň v OS2.2):

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
Odpovězeno 14/10/2011 v 23:57
zdroj uživatelem

hlasů
19

uvnitř 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();
}
Odpovězeno 25/01/2012 v 17:19
zdroj uživatelem

hlasů
1

Hej jen dát jméno na BMP

Udělej to:

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**")

to bude znít, že im jen blbnout, ale zkus to, jakmile dostane uložen v bmp foramt..Cheers

Odpovězeno 22/01/2013 v 12:47
zdroj uživatelem

hlasů
5

Způsob, jakým našel jsem poslat PNG a transparentnost.

String file_path = Environment.getExternalStorageDirectory().getAbsolutePath() +
                    "/CustomDir";
File dir = new File(file_path);
if(!dir.exists())
  dir.mkdirs();

String format = new SimpleDateFormat("yyyyMMddHHmmss",
       java.util.Locale.getDefault()).format(new Date());

File file = new File(dir, format + ".png");
FileOutputStream fOut;
try {
        fOut = new FileOutputStream(file);
        yourbitmap.compress(Bitmap.CompressFormat.PNG, 85, fOut);
        fOut.flush();
        fOut.close();
     } catch (Exception e) {
        e.printStackTrace();
 }

Uri uri = Uri.fromFile(file);     
Intent intent = new Intent(android.content.Intent.ACTION_SEND);
intent.setType("image/*");
intent.putExtra(android.content.Intent.EXTRA_SUBJECT, "");
intent.putExtra(android.content.Intent.EXTRA_TEXT, "");
intent.putExtra(Intent.EXTRA_STREAM, uri);

startActivity(Intent.createChooser(intent,"Sharing something")));
Odpovězeno 08/04/2015 v 09:52
zdroj uživatelem

hlasů
0

Ujistěte se, že adresář je vytvořen před voláním bitmap.compress:

new File(FileName.substring(0,FileName.lastIndexOf("/"))).mkdirs();
Odpovězeno 18/02/2016 v 19:21
zdroj uživatelem

hlasů
6

Zde je ukázkový kód pro ukládání bitmapy do souboru:

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;
}

Nyní tuto funkci volat k uložení bitmapy do interní paměti.

File newfile = savebitmap(bitmap);

Doufám, že to pomůže. Šťastný codeing život.

Odpovězeno 02/04/2016 v 09:41
zdroj uživatelem