Android의 내부 메모리에서 비트 맵 / 이미지 저장 및 읽기


161

내가하고 싶은 일은 이미지를 전화의 내부 메모리에 저장하는 것입니다 (SD 카드 아님) .

내가 어떻게 해?

내 앱의 이미지를 카메라에서 이미지보기로 직접 가져 왔습니다.

이제 내가 원하는 것은 이미지보기 에서이 이미지를 내 안드로이드 장치의 내부 메모리에 저장하고 필요할 때 액세스하는 것입니다.

누구 든지이 작업을 수행하는 방법을 안내 할 수 있습니까?

나는 안드로이드에 약간 익숙하므로 자세한 절차를 가질 수 있다면 감사하겠습니다.


안녕, /data/data/yourapp/app_data/imageDir정확히 어디에 ? stackoverflow.com/questions/40323126/…
Khalil Khalaf

답변:


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

왜 안돼? 함수를 참조하면 파일 경로를 반환합니다. 이를 검색하여 imageview에 표시하는 데 사용할 수 있습니다. 이미지를 검색하는 코드도 넣었습니다
Brijesh Thakur

4
try 블록 내부가 아닌 finally 블록에서 스트림을 실제로 닫아야합니다.
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;
    }
}

용법

  • 저장하려면 :

    new ImageSaver(context).
            setFileName("myImage.png").
            setDirectoryName("images").
            save(bitmap);
  • 로드하려면

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

편집하다:

Google 예제를ImageSaver.setExternal(boolean) 기반으로 외부 저장소에 저장을 지원하기 위해 추가되었습니다 .


13
다음은 수업에 유용한 또 다른 방법입니다.public boolean deleteFile(){ File file = createFile(); return file.delete(); }
Micro

저장된 이미지를 공유하려고하면 "Directory not created (디렉토리가 생성되지 않음)"이 표시되고 이미지가 충돌합니다. 도와주세요?
A. N

이 코드가 사용 가능한 라이센스에 대한 설명을 추가하여 프로젝트에 포함시킬 수 있습니까?
Don Park

2
@DonPark 필요 없음, stackoverflowis의 모든 코드는 stackoverflow 라이센스에 따라 걱정없이 사용할 수 있습니다 :)
Ilya Gazman

이것을 사용하려고하지만 문제가 발생합니다. 내가 게시 한이 질문에 대한 도움이 필요하십니까? 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. 내 안드로이드 장치에 이미지를 넣었지만 경로를 얻을 수 없습니다. 경로를 얻을 수 없으면 함수에 인수로 전달할 수 없습니다 saveImage.
Autonomous

장치에 사진이 있습니다. 파일 탐색기 응용 프로그램과 adb 쉘을 통해 볼 수는 있지만 프로그래밍 방식으로 주소를 얻을 수 없었습니다. 그래도 코드를 사용하여 작성한 다음 다시 읽도록하겠습니다. 독서는 나의 궁극적 인 목표이지만 nil그 사진을 읽으려고 할 때 항상 얻는다 .
자치

1
좋아, 다시 작성한다고 말할 때 이미지 데이터를 비트 배열 또는 원시 데이터로 바이트 배열 형태로 가정합니다. 비트 맵이있는 경우 위 기능을 직접 활용할 수 있습니다. 바이트 배열 형식 인 경우이를 사용하여 비트 맵으로 변환하십시오. Bitmap bitmap = BitmapFactory.decodeByteArray (bitmapdata, 0, bitmapdata .length); 또는 다른 형식 일지라도 비트 맵으로 변환하고 위의 기능을 사용하십시오.
Anurag

확장명으로 "답을 편집했습니다"라는 문제가 발생했기 때문에 확장명을 매개 변수로 추가해야하는 문제를 발견했습니다.
Naveed Ahmad

편집 해 주셔서 감사합니다. 확장은 이름 자체의 일부인 것으로 가정했습니다.
Anurag

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

자세한 내용은 여기를 참조 하십시오


getImageFromInternalStorage () 또는 파일 이름으로 검색하려면 saveToInternalStorage ()에서 수신 한 절대 경로를 사용해야합니까?
Leo Droidcoder

1
그냥은 imageFileName충분히를 검색합니다
Amiraslan

나는 이것을 위해 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);
    }

질문은 내부 저장소에 관한 것입니다.
Denny Kurniawan

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();
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.