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ů
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ů
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ů
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ů
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ů
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ů
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ů
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

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ů
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ů
1

Chcete-li ušetřit rastr do vámi zvoleného adresáře. Udělal jsem knihovna ImageWorker, který umožňuje uživateli načíst, uložit a převést bitmapy / obrazovkami / base64 obrazy.

Min SDK - 14

Předpoklad

  • Ukládání souborů by vyžadovalo WRITE_EXTERNAL_STORAGE svolení.
  • Zálohování souborů by vyžadovalo READ_EXTERNAL_STORAGE svolení.

Úsporné Bitmap / Drawable / Base64

ImageWorker.to(context).
    directory("ImageWorker").
    subDirectory("SubDirectory").
    setFileName("Image").
    withExtension(Extension.PNG).
    save(sourceBitmap,85)

loading Bitmap

val bitmap: Bitmap? = ImageWorker.from(context).
    directory("ImageWorker").
    subDirectory("SubDirectory").
    setFileName("Image").
    withExtension(Extension.PNG).
    load()

Implementace

Přidat závislostí

Project Level Gradle

allprojects {
        repositories {
            ...
            maven { url 'https://jitpack.io' }
        }
    }

V Application Level Gradle

dependencies {
            implementation 'com.github.1AboveAll:ImageWorker:0.51'
    }

Si můžete přečíst více na https://github.com/1AboveAll/ImageWorker/blob/master/README.md

Odpovězeno 09/12/2018 v 04:44
zdroj uživatelem

hlasů
1

Vytvořit miniaturu pro video. To může vrátit null, pokud je obraz poškozený nebo formát není podporován.

private void makeVideoPreview() {
    Bitmap thumbnail = ThumbnailUtils.createVideoThumbnail(videoAbsolutePath, MediaStore.Images.Thumbnails.MINI_KIND);
    saveImage(thumbnail);
}

Chcete-li uložit bitmapy v sdcard použít následující kód

Store Image

private void storeImage(Bitmap image) {
    File pictureFile = getOutputMediaFile();
    if (pictureFile == null) {
        Log.d(TAG,
                "Error creating media file, check storage permissions: ");// e.getMessage());
        return;
    } 
    try {
        FileOutputStream fos = new FileOutputStream(pictureFile);
        image.compress(Bitmap.CompressFormat.PNG, 90, fos);
        fos.close();
    } catch (FileNotFoundException e) {
        Log.d(TAG, "File not found: " + e.getMessage());
    } catch (IOException e) {
        Log.d(TAG, "Error accessing file: " + e.getMessage());
    }  
}

Chcete-li získat cestu pro ukládání snímků

/** Create a File for saving an image or video */
private  File getOutputMediaFile(){
    // To be safe, you should check that the SDCard is mounted
    // using Environment.getExternalStorageState() before doing this. 
    File mediaStorageDir = new File(Environment.getExternalStorageDirectory()
            + "/Android/data/"
            + getApplicationContext().getPackageName()
            + "/Files"); 

    // This location works best if you want the created images to be shared
    // between applications and persist after your app has been uninstalled.

    // Create the storage directory if it does not exist
    if (! mediaStorageDir.exists()){
        if (! mediaStorageDir.mkdirs()){
            return null;
        }
    } 
    // Create a media file name
    String timeStamp = new SimpleDateFormat("ddMMyyyy_HHmm").format(new Date());
    File mediaFile;
        String mImageName="MI_"+ timeStamp +".jpg";
        mediaFile = new File(mediaStorageDir.getPath() + File.separator + mImageName);  
    return mediaFile;
} 
Odpovězeno 28/06/2018 v 13:17
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ů
0

Uložit Bitmap do galerie Bez Compress.

private File saveBitMap(Context context, Bitmap Final_bitmap) {
    File pictureFileDir = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), "Your Folder Name");
    if (!pictureFileDir.exists()) {
        boolean isDirectoryCreated = pictureFileDir.mkdirs();
        if (!isDirectoryCreated)
            Log.i("TAG", "Can't create directory to save the image");
        return null;
    }
    String filename = pictureFileDir.getPath() + File.separator + System.currentTimeMillis() + ".jpg";
    File pictureFile = new File(filename);
    try {
        pictureFile.createNewFile();
        FileOutputStream oStream = new FileOutputStream(pictureFile);
        Final_bitmap.compress(Bitmap.CompressFormat.PNG, 100, oStream);
        oStream.flush();
        oStream.close();
        Toast.makeText(Full_Screen_Activity.this, "Save Image Successfully..", Toast.LENGTH_SHORT).show();
    } catch (IOException e) {
        e.printStackTrace();
        Log.i("TAG", "There was an issue saving the image.");
    }
    scanGallery(context, pictureFile.getAbsolutePath());
    return pictureFile;
}
private void scanGallery(Context cntx, String path) {
    try {
        MediaScannerConnection.scanFile(cntx, new String[]{path}, null, new MediaScannerConnection.OnScanCompletedListener() {
            public void onScanCompleted(String path, Uri uri) {
                Toast.makeText(Full_Screen_Activity.this, "Save Image Successfully..", Toast.LENGTH_SHORT).show();
            }
        });
    } catch (Exception e) {
        e.printStackTrace();
        Log.i("TAG", "There was an issue scanning gallery.");
    }
}
Odpovězeno 13/07/2019 v 07:48
zdroj uživatelem

hlasů
0

Některé nové zařízení neukládat bitmapu Tak jsem vysvětlil o něco víc ..

ujistěte se, že jste přidali pod Svolení

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

a vytvořit soubor XML podle xmlnázvu složky provider_paths.xml

<?xml version="1.0" encoding="utf-8"?>
<paths>
    <external-path
        name="external_files"
        path="." />
</paths>

a AndroidManifest pod

<provider
            android:name="android.support.v4.content.FileProvider"
            android:authorities="${applicationId}.provider"
            android:exported="false"
            android:grantUriPermissions="true">
            <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/provider_paths"/>
        </provider>

Potom stačí zavolat saveBitmapFile (passYourBitmapHere)

public static void saveBitmapFile(Bitmap bitmap) throws IOException {
        File mediaFile = getOutputMediaFile();
        FileOutputStream fileOutputStream = new FileOutputStream(mediaFile);
        bitmap.compress(Bitmap.CompressFormat.JPEG, getQualityNumber(bitmap), fileOutputStream);
        fileOutputStream.flush();
        fileOutputStream.close();
    }

kde

File getOutputMediaFile() {
        File mediaStorageDir = new File(
                Environment.getExternalStorageDirectory(),
                "easyTouchPro");
        if (mediaStorageDir.isDirectory()) {

            // Create a media file name
            String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss")
                    .format(Calendar.getInstance().getTime());
            String mCurrentPath = mediaStorageDir.getPath() + File.separator
                            + "IMG_" + timeStamp + ".jpg";
            File mediaFile = new File(mCurrentPath);
            return mediaFile;
        } else { /// error handling for PIE devices..
            mediaStorageDir.delete();
            mediaStorageDir.mkdirs();
            galleryAddPic(mediaStorageDir);

            return (getOutputMediaFile());
        }
    }

a další metody

public static int getQualityNumber(Bitmap bitmap) {
        int size = bitmap.getByteCount();
        int percentage = 0;

        if (size > 500000 && size <= 800000) {
            percentage = 15;
        } else if (size > 800000 && size <= 1000000) {
            percentage = 20;
        } else if (size > 1000000 && size <= 1500000) {
            percentage = 25;
        } else if (size > 1500000 && size <= 2500000) {
            percentage = 27;
        } else if (size > 2500000 && size <= 3500000) {
            percentage = 30;
        } else if (size > 3500000 && size <= 4000000) {
            percentage = 40;
        } else if (size > 4000000 && size <= 5000000) {
            percentage = 50;
        } else if (size > 5000000) {
            percentage = 75;
        }

        return percentage;
    }

a

void galleryAddPic(File f) {
        Intent mediaScanIntent = new Intent(
                "android.intent.action.MEDIA_SCANNER_SCAN_FILE");
        Uri contentUri = Uri.fromFile(f);
        mediaScanIntent.setData(contentUri);

        this.sendBroadcast(mediaScanIntent);
    }
Odpovězeno 14/01/2019 v 06:09
zdroj uživatelem

hlasů
0

Po Android 4.4 KitKat a od roku 2017 podíl na Android 4.4 a nižší asi o 20% a klesá, to není možné ukládat na SD kartu pomocí Filetřídy a getExternalStorageDirectory()metody. Tato metoda vrátí interní paměti přístroje a obrazy uložit viditelné pro každou aplikaci. Můžete také uložit obrazy soukromé pouze pro aplikace a který má být vymazán, pokud uživatel smaže aplikaci s openFileOutput()metodou.

Počínaje s operačním systémem Android 6.0, můžete formátovat SD kartu jako interní paměti, ale pouze soukromý do přístroje. (Pokud formátovat SD auto jako interní paměti, pouze vaše zařízení může přistupovat ani vidět jeho obsah), můžete uložit na tuto kartu SD s použitím jiné odpovědi, ale pokud chcete používat vyjímatelnou SD kartu je třeba si přečíst mou odpověď níže.

Měli byste používat Storage Access Framework dostat uri do složky onActivityResultzpůsobu činnosti, aby se složka zvolena uživatelem, a přidat načíst persistiable povolení, aby bylo možné získat přístup složku po uživatel spustí zařízení.

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    if (resultCode == RESULT_OK) {

        // selectDirectory() invoked
        if (requestCode == REQUEST_FOLDER_ACCESS) {

            if (data.getData() != null) {
                Uri treeUri = data.getData();
                tvSAF.setText("Dir: " + data.getData().toString());
                currentFolder = treeUri.toString();
                saveCurrentFolderToPrefs();

                // grantUriPermission(getPackageName(), treeUri,
                // Intent.FLAG_GRANT_READ_URI_PERMISSION |
                // Intent.FLAG_GRANT_WRITE_URI_PERMISSION);

                final int takeFlags = data.getFlags()
                        & (Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
                // Check for the freshest data.
                getContentResolver().takePersistableUriPermission(treeUri, takeFlags);

            }
        }
    }
}

Nyní uložte uložit složku pro sdílené preference nežádat uživateli vybrat složku pokaždé, když chcete uložit snímek.

Měli byste používat DocumentFiletřídu pro uložení na disk, ne File, nebo ParcelFileDescriptorpro více informací, můžete zkontrolovat toto vlákno pro uložení snímku na SD kartu s compress(CompressFormat.JPEG, 100, out);metodou a DocumentFiletříd.

Odpovězeno 15/09/2017 v 11:42
zdroj uživatelem

hlasů
0

// | == | Vytvořit PNG soubor z bitmapy:

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

// | == | Získat Bimap ze souboru:

Bitmap getBmjFrmFylFnc(String pthAndFylTtlVar)
{
    return BitmapFactory.decodeFile(pthAndFylTtlVar);
}
Odpovězeno 29/06/2017 v 19:22
zdroj uživatelem

hlasů
0

Ve skutečnosti není odpověď, ale komentář. Jsem na Mac běh emulátoru prostředí a získat java.io.IOException: Permission denied - chyba s tímto kódem:

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

Také jsem přidal používá-oprávnění android.permission.WRITE_EXTERNAL_STORAGE do souboru manifestu (jak poznamenali jiní).

Odpovězeno 11/03/2017 v 17:26
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

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more