Menyimpan dan Membaca Bitmap / Gambar dari Memori internal di Android

161

Yang ingin saya lakukan, adalah menyimpan gambar ke memori internal ponsel (Bukan Kartu SD) .

Bagaimana saya bisa melakukannya?

Saya mendapatkan gambar langsung dari kamera ke tampilan gambar di aplikasi saya, semuanya bekerja dengan baik.

Sekarang yang saya inginkan adalah menyimpan gambar ini dari Tampilan Gambar ke memori internal perangkat android saya dan juga mengaksesnya saat diperlukan.

Adakah yang bisa membimbing saya bagaimana melakukan ini?

Saya sedikit baru untuk android jadi tolong, saya akan sangat menghargai jika saya dapat memiliki prosedur rinci.

Usama Zafar
sumber
Hai, Di mana /data/data/yourapp/app_data/imageDirtepatnya berada? stackoverflow.com/questions/40323126/…
Khalil Khalaf

Jawaban:

344

Gunakan kode di bawah ini untuk menyimpan gambar ke direktori internal.

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

Penjelasan:

1. Direktori akan dibuat dengan nama yang diberikan. Javadocs adalah untuk mengetahui di mana tepatnya ia akan membuat direktori.

2. Anda harus memberikan nama gambar yang Anda inginkan untuk menyimpannya.

Untuk Membaca file dari memori internal. Gunakan kode di bawah ini

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

}
Brijesh Thakur
sumber
Saya perhatikan Anda telah memberikan komentar tertentu, bisakah Anda membimbing saya tentang apa yang tersirat? Seperti yang tentang jalan? Apakah saya harus memberikan jalan atau sesuatu?
Usama Zafar
1
Bagaimana saya bisa mengakses gambar saya dari memori?
Usama Zafar
Saya mengedit jawabannya. Untuk mengakses gambar dari memori. Bagaimana Anda mengatur gambar ke gambar Anda ?? Saya percaya ini hanyalah Bitmap, contoh yang sama yang dapat Anda berikan ke fungsi.
Brijesh Thakur
Kenapa tidak. Lihat fungsinya, ia mengembalikan filepath. yang dapat Anda gunakan untuk mengambilnya dan menunjukkannya ke imageview. Saya telah meletakkan kode untuk mengambil gambar juga
Brijesh Thakur
4
Anda harus benar-benar menutup aliran dari blok akhirnya, bukan dari dalam blok coba.
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;
    }
}

Pemakaian

  • Untuk menyimpan:

    new ImageSaver(context).
            setFileName("myImage.png").
            setDirectoryName("images").
            save(bitmap);
  • Untuk memuat:

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

Edit:

Ditambahkan ImageSaver.setExternal(boolean)untuk mendukung penyimpanan ke penyimpanan eksternal berdasarkan contoh Google .

Ilya Gazman
sumber
13
Berikut adalah metode lain yang berguna untuk dimasukkan ke dalam kelas:public boolean deleteFile(){ File file = createFile(); return file.delete(); }
Micro
ketika saya ingin membagikan gambar yang disimpan, itu mengembalikan "Direktori tidak dibuat" dan gambar macet. Bisakah kamu membantuku?
A. N
dapatkah Anda menambahkan pernyataan tentang lisensi kode ini tersedia di bawah, untuk memungkinkan untuk dimasukkan dalam proyek?
Don Park
2
@ DonPark Tidak perlu, kode apa pun di stackoverflow adalah di bawah lisensi stackoverflow, Anda dapat menggunakan ini tanpa khawatir :)
Ilya Gazman
Saya mencoba menggunakan ini, tetapi mengalami masalah. Adakah bantuan untuk pertanyaan ini yang saya posting? stackoverflow.com/questions/51276641/cannot-find-image-stored @IlyaGazman
Lion789
28

Datangi pertanyaan ini hari ini dan ini adalah bagaimana saya melakukannya. Panggil saja fungsi ini dengan parameter yang diperlukan

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

Demikian pula, untuk membaca yang sama, gunakan ini

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;
}
Anurag
sumber
Bagaimana Anda meneruskan argumen bke fungsi saveImage. Saya telah meletakkan gambar di perangkat android saya, tetapi saya tidak bisa mendapatkan jalan mereka. Jika saya tidak bisa mendapatkan jalan mereka, saya tidak bisa meneruskannya sebagai argumen ke fungsi saveImage.
Autonomous
Saya memiliki foto itu di perangkat. Saya bisa melihatnya melalui aplikasi file explorer dan adb shell, tapi saya tidak bisa mendapatkan alamatnya secara terprogram. Jadi saya membiarkan saya menulisnya menggunakan kode dan kemudian membacanya lagi. Membaca adalah tujuan utama saya tetapi saya selalu mengerti nilketika saya mencoba membaca foto itu.
Otonom
1
ok jadi ketika Anda mengatakan bahwa Anda menulisnya lagi, saya kira Anda memiliki data gambar itu sebagai bitmap atau data mentah dalam bentuk byte-array. Jika Anda memiliki bitmap, Anda dapat langsung menggunakan fungsi di atas. Jika Anda memilikinya dalam bentuk array byte, gunakan ini untuk mengubahnya menjadi bitmap Bitmap bitmap = BitmapFactory.decodeByteArray (bitmapdata, 0, bitmapdata .length); Atau bahkan jika itu dalam bentuk lain, cukup konversikan ke dalam bitmap dan gunakan fungsi-fungsi di atas.
Anurag
"Diedit jawaban" dengan ekstensi, dalam kasus saya masalah diangkat, jadi setelah semua saya menemukan masalah bahwa ekstensi harus ditambahkan sebagai parameter.
Naveed Ahmad
Terima kasih atas hasil editnya, saya menganggap ekstensi sebagai bagian dari nama itu sendiri.
Anurag
6

Untuk pengguna Kotlin, saya membuat ImageStorageManagerkelas yang akan menangani menyimpan, mendapatkan, dan menghapus tindakan untuk gambar dengan mudah:

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

Baca lebih lanjut di sini

Amiraslan
sumber
Apakah Anda harus menggunakan jalur absolut yang diterima dari saveToInternalStorage () untuk mengambilnya dengan getImageFromInternalStorage () atau hanya nama file?
Leo Droidcoder
1
Hanya imageFileNamecukup untuk mengambilnya
Amiraslan
Man I terbuang 10 jam untuk ini
Studi Pb
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);
    }
Anil Singhania
sumber
pertanyaannya adalah tentang penyimpanan internal.
Denny Kurniawan
0

// mutiple image mengambil

 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();
Temui Bhavsar
sumber