Lưu và đọc ảnh bitmap / hình ảnh từ bộ nhớ trong trong Android


161

Những gì tôi muốn làm là lưu hình ảnh vào bộ nhớ trong của điện thoại (Không phải Thẻ SD) .

Tôi làm nó như thế nào?

Tôi đã có được hình ảnh trực tiếp từ máy ảnh đến chế độ xem hình ảnh trong ứng dụng của mình, tất cả đều hoạt động tốt.

Bây giờ điều tôi muốn là lưu hình ảnh này từ Chế độ xem hình ảnh vào Bộ nhớ trong của thiết bị Android của tôi và cũng có thể truy cập nó khi được yêu cầu.

Bất cứ ai có thể xin vui lòng hướng dẫn tôi làm thế nào để làm điều này?

Tôi là một người mới với Android vì vậy xin vui lòng, tôi sẽ đánh giá cao nếu tôi có thể có một thủ tục chi tiết.


Xin chào, /data/data/yourapp/app_data/imageDirvị trí chính xác ở đâu? stackoverflow.com/questions
40323126 / từ

Câu trả lời:


344

Sử dụng mã dưới đây để lưu hình ảnh vào thư mục nội bộ.

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

Giải trình :

1. Thư mục sẽ được tạo với tên đã cho. Javadocs là để cho biết chính xác nơi nó sẽ tạo thư mục.

2.Bạn sẽ phải đặt tên hình ảnh mà bạn muốn lưu nó.

Để đọc tệp từ bộ nhớ trong. Sử dụng mã dưới đây

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

}

Tôi nhận thấy bạn đã đặt một số ý kiến ​​nhất định, bạn có thể hướng dẫn cho tôi những gì đang ngụ ý? Giống như một về con đường? Tôi có phải đưa ra một con đường hay cái gì đó không?
Usama Zafar

1
Làm thế nào tôi có thể truy cập hình ảnh của tôi từ bộ nhớ?
Usama Zafar

Tôi chỉnh sửa câu trả lời. Để truy cập hình ảnh từ bộ nhớ. Làm thế nào bạn thiết lập hình ảnh cho hình ảnh của bạn ?? Tôi tin rằng không có gì ngoài Bitmap, ví dụ tương tự bạn có thể truyền cho hàm.
Brijesh Thakur

Tại sao không. Xem chức năng, nó trả về filepath. mà bạn có thể sử dụng để truy xuất nó và hiển thị nó cho hình ảnh. Tôi cũng đã đặt mã để lấy lại hình ảnh
Brijesh Thakur

4
Bạn thực sự nên đóng luồng từ một khối cuối cùng, không phải từ bên trong khối thử.
Kenn Cal

71
/**
 * 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;
    }
}

Sử dụng

  • Để tiết kiệm:

    new ImageSaver(context).
            setFileName("myImage.png").
            setDirectoryName("images").
            save(bitmap);
  • Để tải:

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

Biên tập:

Đã thêm ImageSaver.setExternal(boolean)để hỗ trợ lưu vào bộ nhớ ngoài dựa trên ví dụ về Google .


13
Đây là một phương pháp hữu ích khác để đưa vào lớp:public boolean deleteFile(){ File file = createFile(); return file.delete(); }
Micro

Khi tôi muốn chia sẻ hình ảnh đã lưu, nó sẽ trả về "Thư mục chưa được tạo" và hình ảnh bị sập. Bạn có thể giúp tôi được không?
A. N

bạn có thể thêm một tuyên bố về giấy phép mà mã này có sẵn để làm cho nó có thể được đưa vào một dự án không?
Công viên Don

2
@DonPark Không cần, bất kỳ mã nào trên stackoverflowis đều thuộc giấy phép stackoverflow, bạn có thể sử dụng nó mà không phải lo lắng :)
Ilya Gazman

Tôi đang cố gắng sử dụng điều này, nhưng gặp vấn đề. Bất kỳ trợ giúp về câu hỏi này tôi đã đăng? stackoverflow.com/questions/51276641/cannot-find-image-stored @IlyaGazman
Lion789

28

Đã đến câu hỏi này ngày hôm nay và đây là cách tôi làm điều đó. Chỉ cần gọi hàm này với các tham số cần thiết

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

Tương tự, để đọc tương tự, sử dụng này

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

Làm thế nào để bạn truyền đối số bcho hàm saveImage. Tôi đã đặt hình ảnh trên thiết bị Android của mình, nhưng tôi không thể tìm thấy đường dẫn của chúng. Nếu tôi không thể có được đường dẫn của chúng, tôi không thể chuyển chúng làm đối số cho hàm saveImage.
Tự trị

Tôi có bức ảnh đó trên thiết bị. Tôi có thể nhìn thấy nó thông qua các ứng dụng thám hiểm tệp cũng như vỏ adb, nhưng tôi không thể lấy địa chỉ của nó theo chương trình. Vì vậy, mặc dù tôi cho phép tôi viết nó bằng mã và sau đó đọc lại nó. Đọc sách là mục đích cuối cùng của tôi nhưng tôi luôn nhận được nilkhi cố gắng đọc bức ảnh đó.
Tự trị

1
ok vì vậy khi bạn nói rằng bạn viết lại nó, tôi cho rằng bạn có dữ liệu hình ảnh đó dưới dạng bitmap hoặc dữ liệu thô dưới dạng mảng byte. Nếu bạn có bitmap, bạn có thể trực tiếp sử dụng các chức năng trên. Nếu bạn có nó ở dạng mảng byte, hãy sử dụng nó để chuyển đổi nó thành bitmap Bitmap bitmap = BitmapFactory.decodeByteArray (bitmapdata, 0, bitmapdata .length); Hoặc thậm chí nếu nó ở bất kỳ dạng nào khác, chỉ cần chuyển đổi nó thành bitmap và sử dụng các chức năng trên.
Anurag

"Đã chỉnh sửa câu trả lời" với phần mở rộng, trong trường hợp của tôi, các vấn đề đã được nêu ra, vì vậy sau tất cả tôi đã tìm thấy vấn đề rằng phần mở rộng nên được thêm vào dưới dạng tham số.
Naveed Ahmad

Cảm ơn đã chỉnh sửa, tôi giả sử tiện ích mở rộng là một phần của tên.
Anurag

6

Đối với người dùng Kotlin, tôi đã tạo một ImageStorageManagerlớp sẽ xử lý các hành động lưu, nhận và xóa cho hình ảnh một cách dễ dàng:

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

Đọc thêm tại đây


Bạn có phải sử dụng đường dẫn tuyệt đối nhận được từ saveToIternalStorage () để truy xuất nó với getImageFromI INTERNalStorage () hoặc chỉ tên tệp không?
Leo Droidcoder

1
Chỉ cần imageFileNameđủ để lấy nó
Amiraslan

Người đàn ông tôi đã lãng phí 10 giờ cho việc này
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);
    }

câu hỏi là về lưu trữ nội bộ.
Denny Kurniawan

0

// lấy hình ảnh đa dạng

 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();
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.