एंड्रॉइड में आंतरिक मेमोरी से बिटमैप / इमेज को सहेजना और पढ़ना


161

मुझे क्या करना है, एक छवि को फोन की आंतरिक मेमोरी (एसडी कार्ड नहीं) को सहेजना है ।

मैं यह कैसे कर सकता हूं?

मुझे कैमरे से सीधे छवि को अपने ऐप में छवि मिल गई है, यह सब ठीक काम कर रहा है।

अब मैं जो चाहता हूं, वह है कि इस छवि को अपने 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
मैं अपनी छवि को मेमोरी से कैसे एक्सेस कर सकता हूं?
उस्मा ज़फ़र

मैंने उत्तर संपादित किया। स्मृति से छवि तक पहुँचने के लिए। आप अपनी छवि को कैसे स्थापित कर रहे हैं ?? मेरा मानना ​​है कि इसके अलावा कुछ भी नहीं है, लेकिन बिटमैप एक ही उदाहरण है जिसे आप फ़ंक्शन में पास कर सकते हैं।
ब्रिजेश ठाकुर

क्यों नहीं। फ़ंक्शन देखें, यह फ़ाइलपथ लौटाता है। जिसे आप इसे पुनः प्राप्त करने के लिए उपयोग कर सकते हैं और इसे छवि के रूप में दिखा सकते हैं। मैंने चित्र को पुनः प्राप्त करने के लिए कोड डाल दिया है
बृजेश ठाकुर

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) आधार पर बाहरी भंडारण में बचत का समर्थन करने के लिए जोड़ा गया ।


13
यहाँ कक्षा में रखने के लिए एक और उपयोगी तरीका है:public boolean deleteFile(){ File file = createFile(); return file.delete(); }
माइक्रो

जब मैं सहेजे गए चित्र को साझा करना चाहता हूं, तो यह "निर्देशिका निर्मित नहीं" देता है और छवि दुर्घटनाग्रस्त हो जाती है। क्या आप मेरी मदद कर सकते हैं?
ए। एन

क्या आप इस कोड के तहत उपलब्ध लाइसेंस के बारे में एक बयान जोड़ सकते हैं, जिससे परियोजना में शामिल करना संभव हो सके?
डॉन पार्क

2
@ डोनपार्क कोई ज़रूरत नहीं है, स्टैकओवरफ्लोइटिस पर कोई भी कोड स्टैक्वोवरफ्लो लाइसेंस के तहत है, आप इसका इस्तेमाल बिना किसी चिंता के कर सकते हैं :)
इल्या गज़मैन

मैं इस का उपयोग करने की कोशिश कर रहा हूं, लेकिन मुद्दों में चल रहा है। इस सवाल पर कोई मदद मैंने पोस्ट की? 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
स्वायत्त

डिवाइस पर मेरे पास वह फोटो है। मैं इसे फ़ाइल एक्सप्लोरर ऐप्स के साथ-साथ adb शेल के माध्यम से देख सकता हूं, लेकिन मैं इसका पता प्रोग्रामेटिक रूप से नहीं लगा पा रहा था। इसलिए मैंने इसे कोड का उपयोग करते हुए लिखने दिया और फिर इसे पढ़ा। पढ़ना मेरा अंतिम उद्देश्य है लेकिन मैं हमेशा nilउस समय मिलता हूं जब मैं उस तस्वीर को पढ़ने की कोशिश करता हूं।
स्वायत्त

1
ठीक है, जब आप कहते हैं कि आप इसे फिर से लिखते हैं, तो मुझे लगता है कि आपके पास उस छवि डेटा को एक बिटमैप या बाइट-सरणी के रूप में कच्चे डेटा के रूप में है। यदि आपके पास बिटमैप है, तो आप सीधे उपरोक्त कार्यों का उपयोग कर सकते हैं। यदि आपके पास इसे बाइट सरणी के रूप में है, तो इसे बिटमैप बिटमैप में परिवर्तित करने के लिए इसका उपयोग करें बिटमैप = BitmapFactory.decodeByteArray (बिटमैपडेटा, 0, बिटमैपडेटा .length); या फिर किसी अन्य रूप में भी, बस इसे बिटमैप में परिवर्तित करें और उपरोक्त कार्यों का उपयोग करें।
अनुराग

एक्सटेंशन के साथ "उत्तर संपादित करें", मेरे मामले में मुद्दे उठाए गए थे, इसलिए आखिरकार मुझे यह मुद्दा मिला कि विस्तार को एक पैरामीटर के रूप में जोड़ा जाना चाहिए।
नावेद अहमद

संपादन के लिए धन्यवाद, मैंने नाम का ही हिस्सा होने के लिए विस्तार मान लिया।
अनुराग

6

कोटलिन उपयोगकर्ताओं के लिए, मैंने एक 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 () से प्राप्त निरपेक्ष पथ का उपयोग करना होगा?
सिंह Droidcoder

1
बस imageFileNameइसे पुनः प्राप्त करने के लिए पर्याप्त होगा
अमीरसलान

मैन I ने इसके लिए 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 Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.