Android'de Dahili bellekten Bitmap'leri / Görüntüleri Kaydetme ve Okuma


161

Yapmak istediğim şey, görüntüyü telefonun dahili belleğine kaydetmektir (SD Kart Değil) .

Nasıl yapabilirim?

Uygulamamdaki görüntü görünümüne doğrudan kameradan görüntü aldım, hepsi iyi çalışıyor.

Şimdi istediğim bu görüntüyü Image View'dan android cihazımın Dahili belleğine kaydetmek ve gerektiğinde erişmek.

Lütfen bunu nasıl yapacağımı bana yol gösterebilir mi?

Ben android için biraz yeniyim, bu yüzden lütfen, ayrıntılı bir prosedür olabilir eğer takdir ediyorum.


Merhaba, /data/data/yourapp/app_data/imageDirTam olarak nerede bulunur? stackoverflow.com/questions/40323126/…
Khalil Khalaf

Yanıtlar:


344

Görüntüyü dahili dizine kaydetmek için aşağıdaki kodu kullanın.

private String saveToInternalStorage(Bitmap bitmapImage){
        ContextWrapper cw = new ContextWrapper(getApplicationContext());
         // path to /data/data/yourapp/app_data/imageDir
        File directory = cw.getDir("imageDir", Context.MODE_PRIVATE);
        // Create imageDir
        File mypath=new File(directory,"profile.jpg");

        FileOutputStream fos = null;
        try {           
            fos = new FileOutputStream(mypath);
       // Use the compress method on the BitMap object to write image to the OutputStream
            bitmapImage.compress(Bitmap.CompressFormat.PNG, 100, fos);
        } catch (Exception e) {
              e.printStackTrace();
        } finally {
            try {
              fos.close();
            } catch (IOException e) {
              e.printStackTrace();
            }
        } 
        return directory.getAbsolutePath();
    }

Açıklama:

Dizin belirtilen adla oluşturulacaktır. Javadocs, dizini tam olarak nerede oluşturacağını söylemek içindir.

2.Kaydetmek istediğiniz görüntü adını vermeniz gerekecektir.

Dosyayı dahili bellekten okumak için. Aşağıdaki kodu kullanın

private void loadImageFromStorage(String path)
{

    try {
        File f=new File(path, "profile.jpg");
        Bitmap b = BitmapFactory.decodeStream(new FileInputStream(f));
            ImageView img=(ImageView)findViewById(R.id.imgPicker);
        img.setImageBitmap(b);
    } 
    catch (FileNotFoundException e) 
    {
        e.printStackTrace();
    }

}

Belirli yorumlarda bulunduğunuzu fark ettim, neyin ima ettiğini bana yol gösterebilir misiniz? Yoldaki gibi mi? Bir yol falan vermek zorunda mıyım?
Usama Zafar

1
Resmime bellekten nasıl erişebilirim?
Usama Zafar

Cevabı düzenledim. Görüntüye bellekten erişmek için. Görüntüyü görüntünüze nasıl ayarlıyorsunuz ?? Ben onun Bitmap dışında hiçbir şeye inanmıyorum, aynı örneği fonksiyona geçebilirsiniz.
Brijesh Thakur

Neden olmasın. İşleve bakın, dosyayolunu döndürür. geri almak ve görüntüleme amacıyla göstermek için kullanabilirsiniz. Ben de görüntüyü almak için kod koydum
Brijesh Thakur

4
Akışı gerçekten nihayet bir bloktan kapatmalısınız, try bloğunun içinden değil.
Kenn Cal

72
/**
 * Created by Ilya Gazman on 3/6/2016.
 */
public class ImageSaver {

    private String directoryName = "images";
    private String fileName = "image.png";
    private Context context;
    private boolean external;

    public ImageSaver(Context context) {
        this.context = context;
    }

    public ImageSaver setFileName(String fileName) {
        this.fileName = fileName;
        return this;
    }

    public ImageSaver setExternal(boolean external) {
        this.external = external;
        return this;
    }

    public ImageSaver setDirectoryName(String directoryName) {
        this.directoryName = directoryName;
        return this;
    }

    public void save(Bitmap bitmapImage) {
        FileOutputStream fileOutputStream = null;
        try {
            fileOutputStream = new FileOutputStream(createFile());
            bitmapImage.compress(Bitmap.CompressFormat.PNG, 100, fileOutputStream);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (fileOutputStream != null) {
                    fileOutputStream.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    @NonNull
    private File createFile() {
        File directory;
        if(external){
            directory = getAlbumStorageDir(directoryName);
        }
        else {
            directory = context.getDir(directoryName, Context.MODE_PRIVATE);
        }
        if(!directory.exists() && !directory.mkdirs()){
            Log.e("ImageSaver","Error creating directory " + directory);
        }

        return new File(directory, fileName);
    }

    private File getAlbumStorageDir(String albumName) {
        return new File(Environment.getExternalStoragePublicDirectory(
                Environment.DIRECTORY_PICTURES), albumName);
    }

    public static boolean isExternalStorageWritable() {
        String state = Environment.getExternalStorageState();
        return Environment.MEDIA_MOUNTED.equals(state);
    }

    public static boolean isExternalStorageReadable() {
        String state = Environment.getExternalStorageState();
        return Environment.MEDIA_MOUNTED.equals(state) ||
                Environment.MEDIA_MOUNTED_READ_ONLY.equals(state);
    }

    public Bitmap load() {
        FileInputStream inputStream = null;
        try {
            inputStream = new FileInputStream(createFile());
            return BitmapFactory.decodeStream(inputStream);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (inputStream != null) {
                    inputStream.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return null;
    }
}

kullanım

  • Kaydetmek:

    new ImageSaver(context).
            setFileName("myImage.png").
            setDirectoryName("images").
            save(bitmap);
  • Yüklemek için:

    Bitmap bitmap = new ImageSaver(context).
            setFileName("myImage.png").
            setDirectoryName("images").
            load();

Düzenle:

Google örneğineImageSaver.setExternal(boolean) göre harici depolama birimine kaydetmeyi desteklemek için eklendi .


13
İşte sınıfa koymak için başka bir yararlı yöntem:public boolean deleteFile(){ File file = createFile(); return file.delete(); }
Micro

kaydedilen görüntüyü paylaşmak istediğimde, "Dizin oluşturulmadı" ifadesini döndürür ve görüntü kilitlenir. bana yardım eder misiniz?
A. N

bir projeye dahil edilmesini sağlamak için bu kodun altında bulunduğu lisans hakkında bir açıklama ekleyebilir misiniz?
Don Park

2
@DonPark Gerek yok, stackoverflowis üzerindeki herhangi bir kod stackoverflow lisansı altındadır, bunu endişesiz kullanabilirsiniz :)
Ilya Gazman

Bunu kullanmaya çalışıyorum ama sorunla karşılaşıyorum. Bu soruya herhangi bir yardım gönderdim mi? stackoverflow.com/questions/51276641/cannot-find-image-stored @IlyaGazman
Lion789

28

Bugün bu soruya rastladım ve işte böyle yapıyorum. Bu işlevi gerekli parametrelerle çağırmanız yeterlidir

public void saveImage(Context context, Bitmap bitmap, String name, String extension){
    name = name + "." + extension;
    FileOutputStream fileOutputStream;
    try {
        fileOutputStream = context.openFileOutput(name, Context.MODE_PRIVATE);
        bitmap.compress(Bitmap.CompressFormat.JPEG, 90, fileOutputStream);
        fileOutputStream.close();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

Benzer şekilde, aynısını okumak için bunu kullanın

public Bitmap loadImageBitmap(Context context,String name,String extension){
    name = name + "." + extension
    FileInputStream fileInputStream
    Bitmap bitmap = null;
    try{
        fileInputStream = context.openFileInput(name);
        bitmap = BitmapFactory.decodeStream(fileInputStream);
        fileInputStream.close();
    } catch(Exception e) {
        e.printStackTrace();
    }
     return bitmap;
}

Argümanı bişleve nasıl iletirsiniz saveImage. Görüntüleri android cihazıma koydum, ancak yollarını alamıyorum. Onların yolunu bulamazsam, onları işleve argüman olarak iletemem saveImage.
Özerk

Cihazda o fotoğraf var. Dosya gezgini uygulamaları ve adb kabuğu aracılığıyla görebiliyorum, ancak adresini programlı olarak alamadım. Bu yüzden kodu kullanarak yazmama izin verin ve sonra tekrar okuyun. Okuma benim nihai amacım ama nilo fotoğrafı okumaya çalıştığımda hep anlıyorum.
Özerk

1
Tamam, tekrar yazdığınızı söylediğinizde, bayt dizisi şeklinde bir bitmap veya ham veri olarak bu görüntü verisine sahip olduğunuzu varsayalım. Bitmap'iniz varsa, yukarıdaki işlevleri doğrudan kullanabilirsiniz. Bayt dizisi biçiminde varsa, bunu bitmap'e dönüştürmek için kullanın Bitmap bitmap = BitmapFactory.decodeByteArray (bitmapdata, 0, bitmapdata .length); Ya da başka bir formda olsa bile, onu bitmap'e dönüştürün ve yukarıdaki işlevleri kullanın.
Anurag

Uzantıyla "yanıtı düzenledi", benim durumumda sorunlar ortaya çıktı, bu yüzden sonuçta ben bu uzantının parametre olarak eklenmesi gerektiğini buldum.
Naveed Ahmad

Düzenleme için teşekkürler, uzantının adının bir parçası olduğunu varsaydım.
Anurag

6

Kotlin kullanıcıları ImageStorageManageriçin, resimler için kaydetme, alma ve silme işlemlerini kolayca gerçekleştirecek bir sınıf oluşturdum :

class ImageStorageManager {
    companion object {
        fun saveToInternalStorage(context: Context, bitmapImage: Bitmap, imageFileName: String): String {
            context.openFileOutput(imageFileName, Context.MODE_PRIVATE).use { fos ->
                bitmapImage.compress(Bitmap.CompressFormat.PNG, 25, fos)
            }
            return context.filesDir.absolutePath
        }

        fun getImageFromInternalStorage(context: Context, imageFileName: String): Bitmap? {
            val directory = context.filesDir
            val file = File(directory, imageFileName)
            return BitmapFactory.decodeStream(FileInputStream(file))
        }

        fun deleteImageFromInternalStorage(context: Context, imageFileName: String): Boolean {
            val dir = context.filesDir
            val file = File(dir, imageFileName)
            return file.delete()
        }
    }
}

Daha fazla oku Buradan


GetImageFromInternalStorage () veya sadece dosya adıyla almak için saveToInternalStorage () öğesinden alınan mutlak yolu kullanmanız mı gerekiyor?
Leo Droidcoder

1
Sadece imageFileNameyeterince geri almak için olacak
Amiraslan

Adam bunun için 10 saat harcadım
Pb Studies

0
    public static String saveImage(String folderName, String imageName, RelativeLayout layoutCollage) {
        String selectedOutputPath = "";
        if (isSDCARDMounted()) {
            File mediaStorageDir = new File(
                    Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), folderName);
            // Create a storage directory if it does not exist
            if (!mediaStorageDir.exists()) {
                if (!mediaStorageDir.mkdirs()) {
                    Log.d("PhotoEditorSDK", "Failed to create directory");
                }
            }
            // Create a media file name
            selectedOutputPath = mediaStorageDir.getPath() + File.separator + imageName;
            Log.d("PhotoEditorSDK", "selected camera path " + selectedOutputPath);
            File file = new File(selectedOutputPath);
            try {
                FileOutputStream out = new FileOutputStream(file);
                if (layoutCollage != null) {
                    layoutCollage.setDrawingCacheEnabled(true);
                    layoutCollage.getDrawingCache().compress(Bitmap.CompressFormat.JPEG, 80, out);
                }
                out.flush();
                out.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        return selectedOutputPath;
    }



private static boolean isSDCARDMounted() {
        String status = Environment.getExternalStorageState();
        return status.equals(Environment.MEDIA_MOUNTED);
    }

soru dahili depolama hakkındadır.
Denny Kurniawan

0

// birden fazla görüntü alma

 File folPath = new File(getIntent().getStringExtra("folder_path"));
 File[] imagep = folPath.listFiles();

 for (int i = 0; i < imagep.length ; i++) {
     imageModelList.add(new ImageModel(imagep[i].getAbsolutePath(), Uri.parse(imagep[i].getAbsolutePath())));
 }
 imagesAdapter.notifyDataSetChanged();
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.