उरी से बिटमैप कैसे प्राप्त करें?


209

उरी से एक बिटमैप ऑब्जेक्ट कैसे प्राप्त करें (यदि मैं इसे अपने आवेदन में उपयोग करने के लिए /data/data/MYFOLDER/myimage.pngया इसमें स्टोर करने में सफल रहा file///data/data/MYFOLDER/myimage.png)?

किसी को भी यह कैसे पूरा करने पर एक विचार है?


30
आपको इस पोस्ट पर अपने स्वीकृत उत्तर को अपडेट करना चाहिए, क्योंकि खदान से बेहतर उत्तर हैं।
विडार वेस्टनेस

1
दूसरा जवाब सही एक है, तीसरे जवाब अधिक पूरा हो गया है।
इग्नाइटकॉडर्स

@VidarVestnes आप इसे क्यों नहीं हटाते?
कार्लोस लोपेज़ मेरी

जवाबों:


-35

। । महत्वपूर्ण: बेहतर समाधान के लिए @Mark Ingram के नीचे और @pjv से उत्तर देखें। । ।

आप यह कोशिश कर सकते हैं:

public Bitmap loadBitmap(String url)
{
    Bitmap bm = null;
    InputStream is = null;
    BufferedInputStream bis = null;
    try 
    {
        URLConnection conn = new URL(url).openConnection();
        conn.connect();
        is = conn.getInputStream();
        bis = new BufferedInputStream(is, 8192);
        bm = BitmapFactory.decodeStream(bis);
    }
    catch (Exception e) 
    {
        e.printStackTrace();
    }
    finally {
        if (bis != null) 
        {
            try 
            {
                bis.close();
            }
            catch (IOException e) 
            {
                e.printStackTrace();
            }
        }
        if (is != null) 
        {
            try 
            {
                is.close();
            }
            catch (IOException e) 
            {
                e.printStackTrace();
            }
        }
    }
    return bm;
}

लेकिन याद रखें, इस विधि को केवल एक थ्रेड (GUI -थ्रेड नहीं) के भीतर से बुलाया जाना चाहिए। मैं एक AsyncTask।


2
URI को एक url में परिवर्तित करने के बारे में क्या है, उदाहरण के लिए yourUri.toURL () का उपयोग करके?
विदर वेस्टनेस

7
@VidarVestnes दोस्त, Url पर कैसे पथ परिवर्तित कर सकते हैं?
धरम जू

7
मुझे समझ में नहीं आता कि यह चयनित उत्तर कैसे है
निक कार्डसो

11
मैं सहमत हूं, इस उत्तर को सर्वश्रेष्ठ के रूप में स्वीकार नहीं किया जाना चाहिए। शायद यह चुना गया था क्योंकि यह पहला जवाब था। इसकी एक पुरानी पोस्ट है। वैसे भी, बेहतर समाधान के लिए नीचे जवाब है।
विदर्भ वेस्टनेस

8
@VidarVestnes पर अपना उत्तर हटाएं
winklerrr

564

यहाँ यह करने का सही तरीका है:

protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
    super.onActivityResult(requestCode, resultCode, data);
    if (resultCode == RESULT_OK)
    {
        Uri imageUri = data.getData();
        Bitmap bitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(), imageUri);
    }
}

यदि आपको बहुत बड़ी छवियां लोड करने की आवश्यकता है, तो निम्न कोड इसे टाइलों में लोड करेगा (बड़ी मेमोरी आवंटन से बचना)

BitmapRegionDecoder decoder = BitmapRegionDecoder.newInstance(myStream, false);  
Bitmap region = decoder.decodeRegion(new Rect(10, 10, 50, 50), null);

इसका जवाब यहां देखें


3
यह कोड हालांकि बड़ी छवियों (मूल रूप से कुछ भी वॉलपेपर आकार) के साथ सौदा नहीं करता है। getBitmap () कॉल decodeStream () जो OOM त्रुटि से stackoverflow.com/questions/2220949/handling-large-bitmaps से विफल हो जाता है । कोई और सलाह? MediaStore.Images.Thumbnails.getThumbnail () स्पष्ट रूप से एक सामग्री नहीं लेता है।
pjv

1
यहाँ उत्तर देखें: stackoverflow.com/questions/4753013/…
मार्क इंग्राम

@MarkIngram क्या यह किसी स्थानीय छवि या सिर्फ कैमरा छवि के साथ काम करता है?
नरेंद्र सिंह

@MarkIngram क्या होगा अगर हमारे पास data.getData () तक पहुंच नहीं है, मेरा मतलब है कि अगर मैं बस गैलरी से कुछ छवि खोलता हूं और मुझे पता है कि इसके रास्ते के बारे में है, तो मैं कैसे उरई और बिटमैप प्राप्त कर सकता हूं?
उमैर

@ आपको उत्तर की टिप्पणियों में पूछने के बजाय एक नया प्रश्न पूछना चाहिए। वैसे: यहाँ एक नज़र है developer.android.com/reference/android/net/Uri.html
winklerrr

111

यहाँ यह करने का सही तरीका है, स्मृति उपयोग पर भी नज़र रखते हुए:

protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
  super.onActivityResult(requestCode, resultCode, data);
  if (resultCode == RESULT_OK)
  {
    Uri imageUri = data.getData();
    Bitmap bitmap = getThumbnail(imageUri);
  }
}

public static Bitmap getThumbnail(Uri uri) throws FileNotFoundException, IOException{
  InputStream input = this.getContentResolver().openInputStream(uri);

  BitmapFactory.Options onlyBoundsOptions = new BitmapFactory.Options();
  onlyBoundsOptions.inJustDecodeBounds = true;
  onlyBoundsOptions.inDither=true;//optional
  onlyBoundsOptions.inPreferredConfig=Bitmap.Config.ARGB_8888;//optional
  BitmapFactory.decodeStream(input, null, onlyBoundsOptions);
  input.close();

  if ((onlyBoundsOptions.outWidth == -1) || (onlyBoundsOptions.outHeight == -1)) {
    return null;
  }

  int originalSize = (onlyBoundsOptions.outHeight > onlyBoundsOptions.outWidth) ? onlyBoundsOptions.outHeight : onlyBoundsOptions.outWidth;

  double ratio = (originalSize > THUMBNAIL_SIZE) ? (originalSize / THUMBNAIL_SIZE) : 1.0;

  BitmapFactory.Options bitmapOptions = new BitmapFactory.Options();
  bitmapOptions.inSampleSize = getPowerOfTwoForSampleRatio(ratio);
  bitmapOptions.inDither = true; //optional
  bitmapOptions.inPreferredConfig=Bitmap.Config.ARGB_8888;//
  input = this.getContentResolver().openInputStream(uri);
  Bitmap bitmap = BitmapFactory.decodeStream(input, null, bitmapOptions);
  input.close();
  return bitmap;
}

private static int getPowerOfTwoForSampleRatio(double ratio){
  int k = Integer.highestOneBit((int)Math.floor(ratio));
  if(k==0) return 1;
  else return k;
}

मार्क इनग्राम के पोस्ट से गेटबिटमैप () कॉल भी डिकोडस्ट्रीम () को कॉल करता है, इसलिए आप कोई कार्यक्षमता नहीं खोते हैं।

संदर्भ:


1
यह वास्तव में मेरी मदद करता है, हालांकि मुझे लगता है कि यह ध्यान देने योग्य है कि इस कीवर्ड का उपयोग स्थिर संदर्भ के भीतर से नहीं किया जा सकता है। मैंने इसे एक तर्क के रूप में गेटबंबेल विधि में पारित किया और यह एक आकर्षण की तरह काम करता है।
मेकिनले स्मिथ

8
क्या कोई मुझे बता सकता है कि मुझे थम्बनेलगेनिज़े को क्या मूल्य देना चाहिए
आबिद

2
InputStream को बंद करना और फिर से खोलना वास्तव में आवश्यक है क्योंकि पहला BitmapFactory.decodeStream (...) कॉल स्ट्रीम की रीडिंग स्थिति को अंत तक सेट करता है, इसलिए स्ट्रीम को फिर से खोले बिना विधि का दूसरा कॉल अब और काम नहीं करेगा!
डोमिनिक

3
कृपया THUMBNAILSIZE का मूल्य बताएं
माइटियन

3
अपने आप में दो की शक्ति के रूप में अनुपात की गणना करना अनावश्यक है क्योंकि डिकोडर स्वयं दो की निकटतम शक्ति के नमूने के आकार के लिए गोल है। इसलिए मेथड कॉल getPowerOfTwoForSampleRatio()को छोड़ दिया जा सकता है। देखें: developer.android.com/reference/android/graphics/…
winklerrr

42
try
{
    Bitmap bitmap = MediaStore.Images.Media.getBitmap(c.getContentResolver() , Uri.parse(paths));
}
catch (Exception e) 
{
    //handle exception
}

और हाँ पथ इस तरह के एक प्रारूप में होना चाहिए

file:///mnt/sdcard/filename.jpg


1
धन्यवाद Itay, यह आसान है, अगर यू के पास यू है तो बस उस रास्ते को पास करना है और बिटमैप को प्राप्त करना है .. यह मेरे लिए काम कर रहा है, आशा है कि आप भी इसे आज़माएं ..
DjP

2
@ धनंजय धन्यवाद, आपका संकेत मेरा दिन बचाता है, और यह कंटेंट प्रदाता से थंबनेल बिटमैप को लोड करने के लिए काम करता है।
नेज्निका

2
इसके अलावा, Uri.parse () में URI प्रारूप होना चाहिए, जैसे: Uri.parse ("फ़ाइल: ///mnt/sdcard/filename.jpg") , अगर हमें java.io.FileNotFoundException नहीं मिलेगी : कोई सामग्री नहीं प्रदाता
नेज्निका

कुछ संपादकीय अच्छा होगा, लेकिन यह ओप्स सवाल का एक अच्छा संक्षिप्त जवाब है जो ज्यादातर मामलों में काम करता है। यह ओपी के सवालों के सीधे जवाब देने वाले इन अन्य उत्तरों के टुकड़े को बाहर करने के लिए पृष्ठ पर रखने के लिए एक अच्छा उत्तर है।
umassthrower

1
@AndroidNewBee c कॉन्सेप्ट ऑब्जेक्ट है।
DjP


16
private void uriToBitmap(Uri selectedFileUri) {
    try {
        ParcelFileDescriptor parcelFileDescriptor =
                getContentResolver().openFileDescriptor(selectedFileUri, "r");
        FileDescriptor fileDescriptor = parcelFileDescriptor.getFileDescriptor();
        Bitmap image = BitmapFactory.decodeFileDescriptor(fileDescriptor);

        parcelFileDescriptor.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

3
यह सभी sdk पर काम करता है .. धन्यवाद। इसका वैकल्पिक तरीका हैBitmap bitmap = MediaStore.Images.Media.getBitmap(context.getContentResolver(), uri);
जिगर पटेल

सबसे वास्तविक उत्तर सभी SDK संतुष्ट
Noaman Akram

13

ऐसा लगता है कि MediaStore.Images.Media.getBitmapइसमें पदावनत किया गया था API 29। अनुशंसित तरीका उपयोग करना है ImageDecoder.createSourceजो इसमें जोड़ा गया थाAPI 28

यहां बताया गया है कि बिटमैप कैसे होगा:

val bitmap = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
    ImageDecoder.decodeBitmap(ImageDecoder.createSource(requireContext().contentResolver, imageUri))
} else {
    MediaStore.Images.Media.getBitmap(requireContext().contentResolver, imageUri)
}

11

आप इस तरह से यूआरआई से बिटमैप प्राप्त कर सकते हैं

Bitmap bitmap = null;
try {
    bitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(), imageUri);
} catch (IOException e) {
    e.printStackTrace();
}

10
Uri imgUri = data.getData();
Bitmap bitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(), imgUri);

2
क्या आप इस बारे में विस्तार से बता सकते हैं कि यह कोड कैसे काम करता है और यह प्रश्न का उत्तर कैसे देता है?
माइकल डोड

2

नीचे की तरह startActivityForResult मेट्रो का उपयोग करें

        startActivityForResult(new Intent(Intent.ACTION_PICK).setType("image/*"), PICK_IMAGE);

और आप इस तरह परिणाम प्राप्त कर सकते हैं:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (resultCode != RESULT_OK) {
        return;
    }
    switch (requestCode) {
        case PICK_IMAGE:
            Uri imageUri = data.getData();
            try {
                Bitmap bitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(), imageUri);
            } catch (IOException e) {
                e.printStackTrace();
            }
         break;
    }
}

2

मेरे पास बहुत सारे तरीके हैं। मेरे लिए यह काम पूरी तरह से।

यदि आप गैलरी से चित्र का चयन करते हैं। आपको या Uriसे प्राप्त करने के लिए वेयर होने की आवश्यकता है , क्योंकि उनमें से एक अलग संस्करण में शून्य हो सकता है।intent.clipdataintent.data

  private fun onChoosePicture(data: Intent?):Bitmap {
        data?.let {
            var fileUri:Uri? = null

              data.clipData?.let {clip->
                  if(clip.itemCount>0){
                      fileUri = clip.getItemAt(0).uri
                  }
              }
            it.data?.let {uri->
                fileUri = uri
            }


               return MediaStore.Images.Media.getBitmap(this.contentResolver, fileUri )
}

1

आप इस संरचना को कर सकते हैं:

protected void onActivityResult(int requestCode, int resultCode, Intent imageReturnedIntent) {
    super.onActivityResult(requestCode, resultCode, imageReturnedIntent);
    switch(requestCode) {
        case 0:
            if(resultCode == RESULT_OK){
                    Uri selectedImage = imageReturnedIntent.getData();
                    Bundle extras = imageReturnedIntent.getExtras();
                    bitmap = extras.getParcelable("data");
            }
            break;
   }

इसके द्वारा आप एक uri को बिटमैप में आसानी से बदल सकते हैं। आशा है कि मदद यू


1
यह एंड्रॉइड नौगट 7.1.1 संस्करण में काम नहीं कर रहा है। यह एक्स्ट्रा .getParcelable ("डेटा"); null लौट रहा है
Developer_vaibhav

1

इनसेट getBitmapजो अब समाप्त हो गया है मैं कोटलिन में निम्नलिखित दृष्टिकोण का उपयोग करता हूं

PICK_IMAGE_REQUEST ->
    data?.data?.let {
        val bitmap = BitmapFactory.decodeStream(contentResolver.openInputStream(it))
        imageView.setImageBitmap(bitmap)
    }

1
  InputStream imageStream = null;
    try {
        imageStream = getContext().getContentResolver().openInputStream(uri);
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    }
    final Bitmap selectedImage = BitmapFactory.decodeStream(imageStream);

1

(KOTLIN) तो, 7 अप्रैल, 2020 तक उपरोक्त वर्णित विकल्पों में से किसी ने भी काम नहीं किया, लेकिन यहां मेरे लिए क्या काम किया गया है:

  1. यदि आप बिटमैप को घाटी में संग्रहीत करना चाहते हैं और इसके साथ एक छवि दृश्य सेट करते हैं, तो इसका उपयोग करें:

    val bitmap = BitmapFactory.decodeFile(currentPhotoPath).also { bitmap -> imageView.setImageBitmap(bitmap) }

  2. यदि आप बिटमैप को और इमेज व्यू में सेट करना चाहते हैं, तो इसका उपयोग करें:

    BitmapFactory.decodeFile(currentPhotoPath).also { bitmap -> imageView.setImageBitmap(bitmap) }


0

मोबाइल गैलरी से छवि उरई प्राप्त करने की पूरी विधि।

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

  if (requestCode == PICK_IMAGE_REQUEST && resultCode == RESULT_OK && data != null && data.getData() != null) {
                Uri filePath = data.getData();

     try { //Getting the Bitmap from Gallery
           Bitmap bitmap = MediaStore.Images.Media.getBitmap(getContentResolver(), filePath);
           rbitmap = getResizedBitmap(bitmap, 250);//Setting the Bitmap to ImageView
           serImage = getStringImage(rbitmap);
           imageViewUserImage.setImageBitmap(rbitmap);
      } catch (IOException e) {
           e.printStackTrace();
      }


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