Збереження та читання растрових зображень / зображень із внутрішньої пам'яті в Android


161

Що я хочу зробити, це зберегти зображення у внутрішній пам'яті телефону (не на SD-картці) .

Як я можу це зробити?

Я отримав зображення прямо з камери на перегляд зображення в моєму додатку, все це працює нормально.

Тепер я хочу зберегти це зображення з перегляду зображень у внутрішній пам'яті мого пристрою Android, а також отримати необхідний доступ до нього.

Може хто-небудь, будь ласка, керував мені, як це зробити?

Я трохи новачок в android, тому, будь ласка, я буду вдячний, якщо я можу отримати детальну процедуру.


Привіт, Де саме /data/data/yourapp/app_data/imageDirрозташований? stackoverflow.com/questions/40323126/…
Халіл Халаф

Відповіді:


344

Використовуйте наведений нижче код, щоб зберегти зображення у внутрішній каталог.

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

Пояснення:

1.Довідник буде створений із заданим іменем. Javadocs призначений розповісти, де саме він створить каталог.

2. Вам потрібно буде вказати ім’я зображення, за допомогою якого ви хочете зберегти його.

Читання файлу з внутрішньої пам'яті. Використовуйте код нижче

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

}

Я зауважую, що ви розмістили певні коментарі, чи можете ви орієнтуватися на мене? Як і той про стежку? Треба мені дати шлях чи щось таке?
Усама Зафар

1
Як я можу отримати доступ до свого зображення з пам'яті?
Усама Зафар

Я відредагував відповідь. Для доступу до зображення з пам'яті. Як ви налаштовуєте зображення на своє зображення ?? Я вважаю, що це не що інше, як Bitmap, той самий екземпляр, який ви можете передати функції.
Brijesh Thakur

Чому ні. Дивіться функцію, вона повертає шлях файлу. який ви можете використати, щоб отримати його та показати його перегляду зображень. Я поставив код і для отримання зображення
Бріеш Тхакур

4
Вам слід дійсно закрити потік з остаточного блоку, а не з блоку спробу.
Кенн Кал

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

Використання

  • Зберегти:

    new ImageSaver(context).
            setFileName("myImage.png").
            setDirectoryName("images").
            save(bitmap);
    
  • Щоб завантажити:

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

Редагувати:

Додано ImageSaver.setExternal(boolean)до підтримки збереження у зовнішньому сховищі на прикладі googles .


13
Ось ще один корисний метод для класу в класі:public boolean deleteFile(){ File file = createFile(); return file.delete(); }
Мікро

коли я хочу поділитися збереженим зображенням, він повертає "Каталог не створений", і зображення перебуває в роботі. можеш допомогти мені?
А. N

Ви можете додати заяву про ліцензію, до якої цей код доступний, щоб дозволити її включити до проекту?
Дон Парк

2
@DonPark Не потрібно, будь-який код на stackoverflowis знаходиться під ліцензією stackoverflow, ви можете використовувати це без побоювань :)
Ілля Газман,

Я намагаюся використовувати це, але стикаюся з проблемами. Будь-яку допомогу з цього питання я розмістив? stackoverflow.com/questions/51276641/cannot-find-image-stored @IlyaGazman
Lion789

28

Я зіткнувся з цим питанням сьогодні, і ось як я це роблю. Просто викличте цю функцію з необхідними параметрами

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

Аналогічно, для читання того ж, використовуйте це

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

Як ви передаєте аргумент bфункції saveImage. Я розмістив зображення на своєму пристрої Android, але я не можу пройти їх шлях. Якщо я не можу пройти їх шлях, я не можу передавати їх як аргументи функції saveImage.
Автономний

Я маю цю фотографію на пристрої. Я бачу це через програми провідника файлів, а також оболонку adb, але я не зміг отримати його адресу програмно. Тож я хоч і дозволю мені написати це за допомогою коду, а потім знову прочитати його. Читання - це моя кінцева мета, але я завжди отримую, nilколи намагаюся прочитати цю фотографію.
Автономний

1
Добре, коли ви говорите, що ви пишете їх ще раз, я вважаю, що у вас є дані зображення у вигляді растрових зображень або необроблених даних у вигляді байтового масиву. Якщо у вас є растрова карта, ви можете безпосередньо використовувати перераховані вище функції. Якщо у вас він є у вигляді байтового масиву, використовуйте це для перетворення його в растрове зображення Bitmap bitmap = BitmapFactory.decodeByteArray (bitmapdata, 0, bitmapdata .length); Або навіть якщо вона є в будь-якій іншій формі, просто перетворіть її в растрову карту і скористайтеся перерахованими вище функціями.
Анураг

"Відредаговано відповідь" із розширенням, у моєму випадку виникли проблеми, тому врешті-решт я виявив, що розширення слід додати як параметр.
Naveed Ahmad

Дякую за редагування, я вважав, що розширення є частиною самого імені.
Анураг

6

Для користувачів Kotlin я створив ImageStorageManagerклас, який легко обробляє дії збереження, отримання та видалення зображень:

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

Детальніше тут


Чи потрібно використовувати абсолютний шлях, отриманий від saveToInternalStorage (), щоб отримати його за допомогою getImageFromInternalStorage () або просто ім'я файлу?
Лев Дродікодер

1
Всього imageFileNameбуде достатньо, щоб отримати його
Аміраслан

Людина, яку я витратив на це 10 годин
дослідження 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);
    }

питання про внутрішнє зберігання.
Денні Курняван

0

// нескінченне отримання зображення

 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();
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.