बिटमैप को स्थान पर सहेजें


469

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

मेरा मुद्दा यह है कि मैं छवि को डाउनलोड कर सकता हूं, इसे बिटमैप के रूप में स्क्रीन पर प्रदर्शित कर सकता हूं। जिस तरह से मैं एक विशेष फ़ोल्डर में एक छवि को बचाने में सक्षम है, वह FileOutputStream का उपयोग करने के लिए है, लेकिन इसके लिए एक बाइट सरणी की आवश्यकता होती है। मुझे यकीन नहीं है कि बिटमैप से बाइट ऐरे में कैसे कन्वर्ट किया जाए (अगर यह सही तरीका है), तो मैं डेटा लिखने के लिए एक FileOutputStream का उपयोग कर सकता हूं।

मेरे पास दूसरा विकल्प MediaStore का उपयोग करना है:

MediaStore.Images.Media.insertImage(getContentResolver(), bm,
    barcodeNumber + ".jpg Card Image", barcodeNumber + ".jpg Card Image");

जो एसडी कार्ड को बचाने के लिए ठीक काम करता है, लेकिन आपको फ़ोल्डर को अनुकूलित करने की अनुमति नहीं देता है।


वास्तव में मैं अपने ऐप में क्या कर रहा हूं। मैं एक बड़ी छवि प्रपत्र वेबसर्वर डाउनलोड करता हूं, इसे मैनिपुलेट करता हूं और बिटमैप को सीधे mImage.setImageBitmap(_result.getBitmap());मेरे onTaskComplete()कॉलबैक के माध्यम से इमेजव्यू में लोड करता हूं । मुझे अब उपयोगकर्ताओं को लंबे समय तक प्रेस संदर्भ मेनू के माध्यम से स्थानीय रूप से फ़ाइल को सहेजने की अनुमति देनी होगी। मुझे नीचे दिए गए समाधान का उपयोग करने में सक्षम होना चाहिए। हालांकि मैं क्या जानना चाहता हूं, क्या आपने इसके लिए एक बेहतर दृष्टिकोण की खोज की है?
वायर्ड 00

यहाँ ऐसा करने का एक शानदार तरीका है: stackoverflow.com/questions/4263375/…
Chepech

जवाबों:


921
try (FileOutputStream out = new FileOutputStream(filename)) {
    bmp.compress(Bitmap.CompressFormat.PNG, 100, out); // bmp is your Bitmap instance
    // PNG is a lossless format, the compression factor (100) is ignored
} catch (IOException e) {
    e.printStackTrace();
}

11
मैंने छवि को संपीड़ित भी किया है लेकिन 100 प्रतिशत तक और जब मैं अपनी छवि को कैनवास में पा रहा हूं तो यह बहुत छोटी है। कोई कारण?
AZ_

3
@ एज़ाज़ यह छवि का आकार नहीं बदलेगा, केवल प्रारूप और (संभावित) गुणवत्ता। यह भी ध्यान देने योग्य है कि 90पीएनजी के रूप में बचत करते समय उपर्युक्त उदाहरण में , संपीड़न गुणवत्ता पर कोई प्रभाव नहीं पड़ेगा, लेकिन जेपीईजी के लिए फर्क पड़ेगा। जेपीईजी के मामले में, आप 0 और 100 के बीच किसी भी संख्या को चुन सकते हैं।
plowman

1
यह ध्यान दिया जाना चाहिए कि 100% गुणवत्ता के साथ .JPEG के लिए इस तरह से बचत करना वास्तव में वेब पर मूल की तुलना में एक अलग छवि को बचाएगा (अधिक से अधिक स्थान लेगा), वैकल्पिक दृष्टिकोण पर विचार करें।
वारपज़िट

42
क्या किसी को फिर से तैयार करना है? मैं सिर्फ मूल छवि को बचाना चाहता हूं।
हेन डु प्लेसिस

2
@HeinduPlessis आपके पास नहीं है लेकिन आपको शायद ऐसा करना चाहिए। कच्चे बिटमैप को सहेजने से प्रारूप के आधार पर (उदाहरण के लिए ARGB_4444 बनाम ARGB_8888) अधिक स्थान लेगा।
इरविन

134

आपको उपयोग करना चाहिए Bitmap.compress() बिटमैप को फ़ाइल के रूप में सहेजने के विधि का । यह आपकी तस्वीर को संकुचित कर देगा (यदि उपयोग किया गया प्रारूप इसकी अनुमति देता है) और इसे आउटपुटस्ट्रीम में धकेल दें।

यहाँ एक बिटमैप उदाहरण का उदाहरण दिया getImageBitmap(myurl)गया है, जिसे JPEG के रूप में संपीड़ित दर 85% के साथ संकुचित किया जा सकता है:

// Assume block needs to be inside a Try/Catch block.
String path = Environment.getExternalStorageDirectory().toString();
OutputStream fOut = null;
Integer counter = 0;
File file = new File(path, "FitnessGirl"+counter+".jpg"); // the File to save , append increasing numeric counter to prevent files from getting overwritten.
fOut = new FileOutputStream(file);

Bitmap pictureBitmap = getImageBitmap(myurl); // obtaining the Bitmap
pictureBitmap.compress(Bitmap.CompressFormat.JPEG, 85, fOut); // saving the Bitmap to a file compressed as a JPEG with 85% compression rate
fOut.flush(); // Not really required
fOut.close(); // do not forget to close the stream

MediaStore.Images.Media.insertImage(getContentResolver(),file.getAbsolutePath(),file.getName(),file.getName());

@JoaquinG कि किसी भी कारण से fOut.flush()इसे छोड़ना संभव नहीं है?
निकोलस

@ निक्लेस मुझे लगता है कि आप फ्लश को छोड़ सकते हैं।
जोकिनग सेप

1
आपको कम अस्पष्टता के लिए शब्दांकन को "85% की संपीड़न दर" से "गुणवत्ता की दर 85%" में बदलना चाहिए। मैं "15% गुणवत्ता" का अर्थ करने के लिए "85% की संपीड़न दर" की व्याख्या करूंगा, लेकिन Bitmap.compressगुणवत्ता निर्दिष्ट करता है।
टिम कुक

क्या आप विधि पोस्ट कर सकते हैंgetImageBitmap(myurl)
आशीष

38
outStream = new FileOutputStream(file);

AndroidManifest.xml में अनुमति के बिना अपवाद फेंक देंगे (कम से कम os2.2 में):

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

10
नहीं अगर आपकी फ़ाइल निरपेक्ष है एक आंतरिक पथ है?
ब्लंडेल

24

अंदर onActivityResult:

String filename = "pippo.png";
File sd = Environment.getExternalStorageDirectory();
File dest = new File(sd, filename);

Bitmap bitmap = (Bitmap)data.getExtras().get("data");
try {
     FileOutputStream out = new FileOutputStream(dest);
     bitmap.compress(Bitmap.CompressFormat.PNG, 90, out);
     out.flush();
     out.close();
} catch (Exception e) {
     e.printStackTrace();
}

7
आप इसे "pippo.jpg" कह रहे हैं, लेकिन आप पीएनजी संपीड़न का उपयोग कर रहे हैं
राल्फेलन

1
यदि आप बिटमैप की गुणवत्ता बदलना चाहते हैं तो संक्षिप्त प्रारूप प्रारूप .JPEG होना चाहिए। पीएनजी प्रारूप में गुणवत्ता को नहीं बदला जा सकता है।
मुस्तफा गुवेन

13

पीएनजी जैसे कुछ प्रारूप जो दोषरहित हैं, गुणवत्ता सेटिंग की उपेक्षा करेंगे।


2
पीएनजी अभी भी एक संकुचित प्रारूप है। क्या गुणवत्ता सेटिंग संपीड़न गुणवत्ता को संशोधित नहीं करती है?
तमसा बार्टा

डॉक्स स्थिति (मेरे द्वारा हाइलाइटिंग): कंप्रेसर को संकेत, 0-100। 0 का मतलब छोटे आकार के लिए सेक, 100 का मतलब अधिकतम गुणवत्ता के लिए सेक। पीएनजी जैसे कुछ प्रारूप, जो दोषरहित हैं, गुणवत्ता सेटिंग की अनदेखी करेंगे
स्टीफन हेन्निसेन

10

बिटमैप को फ़ाइल में सहेजने के लिए नमूना कोड यहां दिया गया है:

public static File savebitmap(Bitmap bmp) throws IOException {
    ByteArrayOutputStream bytes = new ByteArrayOutputStream();
    bmp.compress(Bitmap.CompressFormat.JPEG, 60, bytes);
    File f = new File(Environment.getExternalStorageDirectory()
            + File.separator + "testimage.jpg");
    f.createNewFile();
    FileOutputStream fo = new FileOutputStream(f);
    fo.write(bytes.toByteArray());
    fo.close();
    return f;
}

बिटमैप को आंतरिक मेमोरी में सहेजने के लिए अब इस फ़ंक्शन को कॉल करें।

File newfile = savebitmap(bitmap);

मुझे आशा है कि यह आपकी मदद करेगा। खुशहाल जीवन।


8
Bitmap bbicon;

bbicon=BitmapFactory.decodeResource(getResources(),R.drawable.bannerd10);
//ByteArrayOutputStream baosicon = new ByteArrayOutputStream();
//bbicon.compress(Bitmap.CompressFormat.PNG,0, baosicon);
//bicon=baosicon.toByteArray();

String extStorageDirectory = Environment.getExternalStorageDirectory().toString();
OutputStream outStream = null;
File file = new File(extStorageDirectory, "er.PNG");
try {
    outStream = new FileOutputStream(file);
    bbicon.compress(Bitmap.CompressFormat.PNG, 100, outStream);
    outStream.flush();
    outStream.close();
} catch(Exception e) {

}

1
यदि आप 'कंप्रेस' विधि से गुजर रहे हैं तो आपको आउटस्ट्रीम को फ्लश करने की आवश्यकता नहीं है। वह तरीका आपकी ओर से होगा।
धर्म

7

Bitmap.compress100 के साथ विधि क्यों नहीं कहते हैं (जो ऐसा लगता है कि यह दोषरहित है)?


भले ही इसे नजरअंदाज कर दिया जाए लेकिन यह 100 होना चाहिए। अगर किसी दिन कंप्रेस फॉर्मेट को शिथिल रूप में बदल दिया जाता है, तो छवि सबसे निकट से मेल खाएगी। यह भी नोट करें कि क्या आपके पास कोड है जो अमूर्त है, यह शायद अधिक महत्वपूर्ण है।
ddcruver

2
JPEG, FWIW के साथ 100% दोषरहित नहीं है। आप बार-बार बिटमैप को लोड करके और सहेज कर इसे सत्यापित कर सकते हैं।

5

मैं एक तस्वीर भी सहेजना चाहूंगा। लेकिन मेरी समस्या (?) यह है कि मैं इसे बिटमैप से बचाना चाहता हूं जिसे ive आरेखित करता है।

मैंने इसे इस तरह बनाया है:

 @Override
 public boolean onOptionsItemSelected(MenuItem item) {
            switch (item.getItemId()) {
            case R.id.save_sign:      

                myView.save();
                break;

            }
            return false;    

    }

public void save() {
            String filename;
            Date date = new Date(0);
            SimpleDateFormat sdf = new SimpleDateFormat ("yyyyMMddHHmmss");
            filename =  sdf.format(date);

            try{
                 String path = Environment.getExternalStorageDirectory().toString();
                 OutputStream fOut = null;
                 File file = new File(path, "/DCIM/Signatures/"+filename+".jpg");
                 fOut = new FileOutputStream(file);

                 mBitmap.compress(Bitmap.CompressFormat.JPEG, 85, fOut);
                 fOut.flush();
                 fOut.close();

                 MediaStore.Images.Media.insertImage(getContentResolver()
                 ,file.getAbsolutePath(),file.getName(),file.getName());

            }catch (Exception e) {
                e.printStackTrace();
            }

 }

आपकी बचत विधि केवल मेरे लिए काम करती है .. कुछ घंटे बर्बाद करने के बाद .. बहुत बहुत धन्यवाद सर।
मोहम्मद सूफियान

5

जिस तरह से मैंने पीएनजी और पारदर्शिता भेजने के लिए पाया।

String file_path = Environment.getExternalStorageDirectory().getAbsolutePath() +
                    "/CustomDir";
File dir = new File(file_path);
if(!dir.exists())
  dir.mkdirs();

String format = new SimpleDateFormat("yyyyMMddHHmmss",
       java.util.Locale.getDefault()).format(new Date());

File file = new File(dir, format + ".png");
FileOutputStream fOut;
try {
        fOut = new FileOutputStream(file);
        yourbitmap.compress(Bitmap.CompressFormat.PNG, 85, fOut);
        fOut.flush();
        fOut.close();
     } catch (Exception e) {
        e.printStackTrace();
 }

Uri uri = Uri.fromFile(file);     
Intent intent = new Intent(android.content.Intent.ACTION_SEND);
intent.setType("image/*");
intent.putExtra(android.content.Intent.EXTRA_SUBJECT, "");
intent.putExtra(android.content.Intent.EXTRA_TEXT, "");
intent.putExtra(Intent.EXTRA_STREAM, uri);

startActivity(Intent.createChooser(intent,"Sharing something")));

यहाँ मूल्य 85 का कोई मतलब नहीं है क्योंकि PNG दोषरहित है। प्रलेखन कहते हैं - `कुछ प्रारूपों, पीएनजी की तरह जो नष्ट नहीं होता है, गुणवत्ता setting` पर ध्यान नहीं देगा
Minhaz

2

एक वीडियो के लिए एक वीडियो थंबनेल बनाएं। यदि वीडियो दूषित है या प्रारूप समर्थित नहीं है तो यह अशक्त हो सकता है।

private void makeVideoPreview() {
    Bitmap thumbnail = ThumbnailUtils.createVideoThumbnail(videoAbsolutePath, MediaStore.Images.Thumbnails.MINI_KIND);
    saveImage(thumbnail);
}

Sdcard में अपने बिटमैप को बचाने के लिए निम्नलिखित कोड का उपयोग करें

स्टोर छवि

private void storeImage(Bitmap image) {
    File pictureFile = getOutputMediaFile();
    if (pictureFile == null) {
        Log.d(TAG,
                "Error creating media file, check storage permissions: ");// e.getMessage());
        return;
    } 
    try {
        FileOutputStream fos = new FileOutputStream(pictureFile);
        image.compress(Bitmap.CompressFormat.PNG, 90, fos);
        fos.close();
    } catch (FileNotFoundException e) {
        Log.d(TAG, "File not found: " + e.getMessage());
    } catch (IOException e) {
        Log.d(TAG, "Error accessing file: " + e.getMessage());
    }  
}

छवि संग्रहण के लिए पथ प्राप्त करने के लिए

/** Create a File for saving an image or video */
private  File getOutputMediaFile(){
    // To be safe, you should check that the SDCard is mounted
    // using Environment.getExternalStorageState() before doing this. 
    File mediaStorageDir = new File(Environment.getExternalStorageDirectory()
            + "/Android/data/"
            + getApplicationContext().getPackageName()
            + "/Files"); 

    // This location works best if you want the created images to be shared
    // between applications and persist after your app has been uninstalled.

    // Create the storage directory if it does not exist
    if (! mediaStorageDir.exists()){
        if (! mediaStorageDir.mkdirs()){
            return null;
        }
    } 
    // Create a media file name
    String timeStamp = new SimpleDateFormat("ddMMyyyy_HHmm").format(new Date());
    File mediaFile;
        String mImageName="MI_"+ timeStamp +".jpg";
        mediaFile = new File(mediaStorageDir.getPath() + File.separator + mImageName);  
    return mediaFile;
} 

2

आप बिटमैप को अपनी पसंद की निर्देशिका में सहेजना चाहते हैं। मैंने एक लाइब्रेरी इमेजवर्कर बनाया है जो उपयोगकर्ता को बिटमैप / ड्राबेल / बेस 64 इमेज को लोड, सेव और कन्वर्ट करने में सक्षम बनाता है।

न्यूनतम एसडीके - 14

पूर्व-अपेक्षा

  • फ़ाइलों को सहेजने के लिए WRITE_EXTERNAL_STORAGE अनुमति की आवश्यकता होगी।
  • फ़ाइलों को पुनर्प्राप्त करने के लिए READ_EXTERNAL_STORAGE अनुमति की आवश्यकता होगी।

बिटमैप सेविंग / ड्राएबल / बेस 64

ImageWorker.to(context).
    directory("ImageWorker").
    subDirectory("SubDirectory").
    setFileName("Image").
    withExtension(Extension.PNG).
    save(sourceBitmap,85)

बिटमैप लोड हो रहा है

val bitmap: Bitmap? = ImageWorker.from(context).
    directory("ImageWorker").
    subDirectory("SubDirectory").
    setFileName("Image").
    withExtension(Extension.PNG).
    load()

कार्यान्वयन

निर्भरता जोड़ें

प्रोजेक्ट लेवल ग्रेड में

allprojects {
        repositories {
            ...
            maven { url 'https://jitpack.io' }
        }
    }

आवेदन स्तर ग्रेड में

dependencies {
            implementation 'com.github.ihimanshurawat:ImageWorker:0.51'
    }

आप https://github.com/ihimanshurawat/ImageWorker/blob/master/README.md पर अधिक पढ़ सकते हैं


1

अरे बस नाम दे दो .bmp

यह करो:

ByteArrayOutputStream bytes = new ByteArrayOutputStream();
_bitmapScaled.compress(Bitmap.CompressFormat.PNG, 40, bytes);

//you can create a new file name "test.BMP" in sdcard folder.
File f = new File(Environment.getExternalStorageDirectory()
                        + File.separator + "**test.bmp**")

ऐसा लगेगा कि IM JUST FOOLING AROUND है, लेकिन इसे एक बार आज़माकर देखें कि bmp foramt..Cheers में सेव हो जाएगा


1

सुनिश्चित करें कि कॉल करने से पहले निर्देशिका बनाई गई है bitmap.compress:

new File(FileName.substring(0,FileName.lastIndexOf("/"))).mkdirs();

1

एंड्रॉइड 4.4 किटकैट के बाद, और 2017 के एंड्रॉइड 4.4 के शेयर के रूप में और लगभग 20% कम और कम हो रहा है, Fileवर्ग और getExternalStorageDirectory()विधि का उपयोग करके एसडी कार्ड को सहेजना संभव नहीं है । यह विधि आपके डिवाइस की आंतरिक मेमोरी और छवियों को हर ऐप में दिखाई देती है। आप छवियों को केवल अपने ऐप पर ही निजी रूप से सहेज सकते हैं और जब उपयोगकर्ता आपके ऐप को हटाता है तो उसे हटा दिया जा सकता हैopenFileOutput() विधि से ।

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

आपको उपयोगकर्ता द्वारा चयनित फ़ोल्डर प्राप्त करने के लिए यूआरआई प्राप्त करने के लिए संग्रहणonActivityResult विधि फ्रेमवर्क का उपयोग करना चाहिए , और उपयोगकर्ता द्वारा डिवाइस को पुनरारंभ करने के बाद फ़ोल्डर तक पहुंचने में सक्षम होने के लिए पुन: उपयोग करने योग्य अनुमति जोड़ें।

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    if (resultCode == RESULT_OK) {

        // selectDirectory() invoked
        if (requestCode == REQUEST_FOLDER_ACCESS) {

            if (data.getData() != null) {
                Uri treeUri = data.getData();
                tvSAF.setText("Dir: " + data.getData().toString());
                currentFolder = treeUri.toString();
                saveCurrentFolderToPrefs();

                // grantUriPermission(getPackageName(), treeUri,
                // Intent.FLAG_GRANT_READ_URI_PERMISSION |
                // Intent.FLAG_GRANT_WRITE_URI_PERMISSION);

                final int takeFlags = data.getFlags()
                        & (Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
                // Check for the freshest data.
                getContentResolver().takePersistableUriPermission(treeUri, takeFlags);

            }
        }
    }
}

हर बार जब आप किसी छवि को सहेजना चाहते हैं तो फ़ोल्डर को सेव करने के लिए साझा वरीयताओं को बचाने के लिए उपयोगकर्ता को फ़ोल्डर का चयन करने के लिए न कहें।

आप का उपयोग करना चाहिए DocumentFileअपनी छवि, नहीं बचाने के लिए वर्ग Fileया ParcelFileDescriptorअधिक जानकारी के लिए, आप जाँच कर सकते हैं इस सूत्र एसडी के साथ कार्ड के लिए छवि को बचाने के लिए compress(CompressFormat.JPEG, 100, out);विधि और DocumentFileवर्गों।


1

कुछ नए उपकरण बिटमैप को नहीं बचाते हैं इसलिए मैंने थोड़ा और समझाया ..

सुनिश्चित करें कि आपने अनुमति के नीचे जोड़ा है

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

और के तहत एक xml फ़ाइल बनाएँ xmlफ़ोल्डर नाम provider_paths.xml

<?xml version="1.0" encoding="utf-8"?>
<paths>
    <external-path
        name="external_files"
        path="." />
</paths>

और के तहत AndroidManifest में

<provider
            android:name="android.support.v4.content.FileProvider"
            android:authorities="${applicationId}.provider"
            android:exported="false"
            android:grantUriPermissions="true">
            <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/provider_paths"/>
        </provider>

तो बस saveBitmapFile (passYourBitmapHere) को कॉल करें

public static void saveBitmapFile(Bitmap bitmap) throws IOException {
        File mediaFile = getOutputMediaFile();
        FileOutputStream fileOutputStream = new FileOutputStream(mediaFile);
        bitmap.compress(Bitmap.CompressFormat.JPEG, getQualityNumber(bitmap), fileOutputStream);
        fileOutputStream.flush();
        fileOutputStream.close();
    }

कहाँ पे

File getOutputMediaFile() {
        File mediaStorageDir = new File(
                Environment.getExternalStorageDirectory(),
                "easyTouchPro");
        if (mediaStorageDir.isDirectory()) {

            // Create a media file name
            String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss")
                    .format(Calendar.getInstance().getTime());
            String mCurrentPath = mediaStorageDir.getPath() + File.separator
                            + "IMG_" + timeStamp + ".jpg";
            File mediaFile = new File(mCurrentPath);
            return mediaFile;
        } else { /// error handling for PIE devices..
            mediaStorageDir.delete();
            mediaStorageDir.mkdirs();
            galleryAddPic(mediaStorageDir);

            return (getOutputMediaFile());
        }
    }

और अन्य तरीके

public static int getQualityNumber(Bitmap bitmap) {
        int size = bitmap.getByteCount();
        int percentage = 0;

        if (size > 500000 && size <= 800000) {
            percentage = 15;
        } else if (size > 800000 && size <= 1000000) {
            percentage = 20;
        } else if (size > 1000000 && size <= 1500000) {
            percentage = 25;
        } else if (size > 1500000 && size <= 2500000) {
            percentage = 27;
        } else if (size > 2500000 && size <= 3500000) {
            percentage = 30;
        } else if (size > 3500000 && size <= 4000000) {
            percentage = 40;
        } else if (size > 4000000 && size <= 5000000) {
            percentage = 50;
        } else if (size > 5000000) {
            percentage = 75;
        }

        return percentage;
    }

तथा

void galleryAddPic(File f) {
        Intent mediaScanIntent = new Intent(
                "android.intent.action.MEDIA_SCANNER_SCAN_FILE");
        Uri contentUri = Uri.fromFile(f);
        mediaScanIntent.setData(contentUri);

        this.sendBroadcast(mediaScanIntent);
    }

क्या आपको इस बारे में कुछ और जानकारी है error handling for PIE devices..और मुझे लगता है कि getOutputMediaFileयदि वर्कअराउंड विफल हो जाता है, तो पुनरावृत्ति एक अनंत लूप हो सकती है।
रायमुंड वेज

0

बिटमैप को अपनी गैलरी में बिना कंप्रेस के सेव करें।

private File saveBitMap(Context context, Bitmap Final_bitmap) {
    File pictureFileDir = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), "Your Folder Name");
    if (!pictureFileDir.exists()) {
        boolean isDirectoryCreated = pictureFileDir.mkdirs();
        if (!isDirectoryCreated)
            Log.i("TAG", "Can't create directory to save the image");
        return null;
    }
    String filename = pictureFileDir.getPath() + File.separator + System.currentTimeMillis() + ".jpg";
    File pictureFile = new File(filename);
    try {
        pictureFile.createNewFile();
        FileOutputStream oStream = new FileOutputStream(pictureFile);
        Final_bitmap.compress(Bitmap.CompressFormat.PNG, 100, oStream);
        oStream.flush();
        oStream.close();
        Toast.makeText(Full_Screen_Activity.this, "Save Image Successfully..", Toast.LENGTH_SHORT).show();
    } catch (IOException e) {
        e.printStackTrace();
        Log.i("TAG", "There was an issue saving the image.");
    }
    scanGallery(context, pictureFile.getAbsolutePath());
    return pictureFile;
}
private void scanGallery(Context cntx, String path) {
    try {
        MediaScannerConnection.scanFile(cntx, new String[]{path}, null, new MediaScannerConnection.OnScanCompletedListener() {
            public void onScanCompleted(String path, Uri uri) {
                Toast.makeText(Full_Screen_Activity.this, "Save Image Successfully..", Toast.LENGTH_SHORT).show();
            }
        });
    } catch (Exception e) {
        e.printStackTrace();
        Log.i("TAG", "There was an issue scanning gallery.");
    }
}

-1

// | == | बिटमैप से PNG फ़ाइल बनाएँ:

void devImjFylFnc(String pthAndFylTtlVar, Bitmap iptBmjVar)
{
    try
    {
        FileOutputStream fylBytWrtrVar = new FileOutputStream(pthAndFylTtlVar);
        iptBmjVar.compress(Bitmap.CompressFormat.PNG, 100, fylBytWrtrVar);
        fylBytWrtrVar.close();
    }
    catch (Exception errVar) { errVar.printStackTrace(); }
}

// | == | फ़ाइल से Bimap प्राप्त करें:

Bitmap getBmjFrmFylFnc(String pthAndFylTtlVar)
{
    return BitmapFactory.decodeFile(pthAndFylTtlVar);
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.