কিভাবে একটি উরি থেকে বিটম্যাপ পাবেন?


209

আমার অ্যাপ্লিকেশনটিতে এটি ব্যবহার করার জন্য কীভাবে কোনও উরি থেকে বিটম্যাপ অবজেক্ট পাবেন (যদি আমি এটি সঞ্চয় করতে সক্ষম হই /data/data/MYFOLDER/myimage.pngবা file///data/data/MYFOLDER/myimage.png)

কীভাবে এটি সম্পাদন করা যায় সে সম্পর্কে কারও ধারণা আছে?


30
আমার চেয়ে ভাল উত্তর আছে বলে আপনার এই পোস্টে আপনার গৃহীত উত্তর আপডেট করা উচিত।
বিদার ভেষ্টনেস

1
দ্বিতীয় উত্তর সঠিক হয় তৃতীয় জবাব আরো সম্পূর্ণ।
IgniteCoders

@ বিডারভেষ্টনেস আপনি এটিকে মুছবেন না কেন?
কার্লোস ল্যাপেজ মারি

উত্তর:


-35

। । গুরুত্বপূর্ণ: আরও ভাল সমাধানের জন্য নীচের @ মার্ক ইনগ্রাম এবং @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;
}

তবে মনে রাখবেন, এই পদ্ধতিটি কেবল একটি থ্রেডের (জিইউআই-থ্রেড নয়) থেকে কল করা উচিত। আমি একটি অ্যাসিঙ্কটাস্ক।


2
ইউআরআইকে কোনও ইউআরএল রূপান্তর করার বিষয়ে কী, যেমন আপনার ইউরি.টোরিয়াল () ব্যবহার করে?
ভিডার ভেষ্টনেস

7
@ বিডারভেস্টনেস বন্ধু, কীভাবে ফাইলকে ইউরএলে রূপান্তর করা যায়?
ধরম

7
আমি বুঝতে পারি না এটি কীভাবে নির্বাচিত উত্তর
নিক কার্ডোসো

11
আমি সম্মত, এই উত্তরটি সেরা হিসাবে গ্রহণ করা উচিত নয়। এটি চয়ন ছিল কারণ এটি প্রথম উত্তর ছিল। এটি একটি পুরানো পোস্ট। যাইহোক, আরও ভাল সমাধানের জন্য নীচে উত্তরগুলি দেখুন।
বিদার ভেষ্টনেস

8
@ বিডারভেস্টনেস আপনার উত্তরটি সরিয়ে ফেলুন
উইঙ্কলারের

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 kills ত্রুটি সহ ব্যর্থ কল stackoverflow.com/questions/2220949/handling-large-bitmaps । অন্য কোন পরামর্শ? MediaStore.Images.Thumbnails.getThumbnail () দৃশ্যত একটি সামগ্রী ইউআরআই নেয় না।
pjv

1
উত্তরটি এখানে দেখুন: stackoverflow.com/questions/4753013/…
মার্ক ইঙ্গ্রাম

@ মার্ককিগ্রাম কোনও স্থানীয় চিত্র বা কেবল ক্যামেরার চিত্র নিয়ে এটি কাজ করে?
নরেন্দ্র সিং 6

@ মার্ককিগ্রাম কীভাবে যদি আমাদের ডেটাতে অ্যাক্সেস না করে থাকে? ডেটা (ডেটা), আমার অর্থ যদি আমি গ্যালারী থেকে কিছু চিত্র খোলাম এবং আমি সবাই জানি যে এটির পথ সম্পর্কে আমি কীভাবে ইউরি এবং বিটম্যাপ পেতে পারি?
উমাইর

@ উমির আপনাকে উত্তরের মন্তব্যে জিজ্ঞাসা না করে নতুন প্রশ্ন জিজ্ঞাসা করা উচিত যাইহোক, এখানে একবার দেখুন ডেভেলপার.অ্যান্ড্রয়েড
রেফারেন্স

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
এটি সত্যিই আমাকে সহায়তা করেছিল, যদিও আমি মনে করি এটি উল্লেখ করার মতো যে এই কীওয়ার্ডটি কোনও স্থির প্রসঙ্গের মধ্যে থেকে ব্যবহার করা যায় না। আমি এটি আর্গুমেন্ট হিসাবে getThumbnail পদ্ধতিতে পাস করেছি এবং এটি একটি কবজির মতো কাজ করে।
ম্যাক কিনলে স্মিথ

8
কেউ কি আমাকে বলতে পারেন যে আমি থাম্বনাইলসিকে কী মূল্য দিতে হবে
আবিদ

2
ইনপুটস্ট্রিমটি বন্ধ এবং পুনরায় চালু করা আসলে প্রয়োজনীয় কারণ প্রথম বিটম্যাপফ্যাক্টরি.ডেকোড স্ট্রিম (...) কলটি স্ট্রিমের পঠন অবস্থানটি শেষ করে দেয়, সুতরাং পদ্ধতির দ্বিতীয় কলটি স্ট্রিমটি আবার চালু না করে আর কাজ করবে না!
ডমিনিকএম

3
দয়া করে
থাম্বলনলাইজের

3
দু'জনের পাওয়ার হিসাবে অনুপাতটি নিজের দ্বারা গণনা করা অপ্রয়োজনীয় কারণ ডিকোডার নিজেই দু'টির নিকটতম শক্তির নমুনার আকারের চারপাশে। সুতরাং পদ্ধতি কল getPowerOfTwoForSampleRatio()বাদ দেওয়া যেতে পারে। দেখুন: developer.android.com/references/android/ographicics/…
উইঙ্কলারের

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, এটি সহজ, আপনার যদি পথ থাকে তবে আপনাকে কেবল সেই পথটি অতিক্রম করতে হবে এবং বিটম্যাপটি পেতে হবে .. এটি আমার পক্ষে কাজ করছে, আশা করি
আপনিও

2
@ ধনঞ্জয় আপনাকে ধন্যবাদ, আপনার ইঙ্গিতটি আমার দিনকে বাঁচায় এবং এটি সামগ্রী সরবরাহকারী থেকে থাম্বনেইল বিটম্যাপটি লোড করতে কাজ করে।
নেজনিকা

2
এছাড়াও, Uri.parse () এর অবশ্যই ইউআরআই ফর্ম্যাট থাকতে হবে, যেমন: Uri.parse ("ফাইল: ///mnt/sdcard/filename.jpg") , না হলে আমরা java.io.FileNotFoundException পাবেন: সামগ্রী নেই প্রদানকারী
নেজনিকা

কিছু সম্পাদকীয়করণ দুর্দান্ত হবে তবে বেশিরভাগ ক্ষেত্রে কাজ করে এমন ওপিএস প্রশ্নের উত্তম উত্তম উত্তর। এই অন্যান্য উত্তরের টুকরোগুলি বিশ্লেষণের জন্য এই পৃষ্ঠায় থাকা একটি দুর্দান্ত উত্তর যা ওপিএস প্রশ্নের সরাসরি উত্তর দেয়।
umassthrower

1
@ অ্যান্ড্রয়েডনিউবি সি হ'ল কনটেক্সট অবজেক্ট।
ডিজেপি


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
এটি সমস্ত এসডিকে কাজ করে .. ধন্যবাদ। এটির বিকল্প উপায়Bitmap bitmap = MediaStore.Images.Media.getBitmap(context.getContentResolver(), uri);
জিগার প্যাটেল

সমস্ত আসল উত্তরটি এসডিকে সন্তুষ্ট
নওমান আকরাম

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(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.clipdataবা আপনার যত্নবান হওয়া দরকার intent.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;
   }

এটির মাধ্যমে আপনি সহজেই ইউরিকে বিটম্যাপে রূপান্তর করতে পারবেন। আশা করি আপনি


1
এটি অ্যান্ড্রয়েড নওগ্যাট 7.1.1 সংস্করণে কাজ করছে না। এই এক্সট্রা.সেটপ্রেসেসেবল ("ডেটা");
বিকাশকারী_ভাইভব

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

(কোটলিন) সুতরাং, April ই এপ্রিল, ২০২০ পর্যন্ত উপরে উল্লিখিত বিকল্পগুলির কোনওটিই কাজ করেনি, তবে এখানে আমার পক্ষে কী কাজ করেছে তা এখানে:

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


   }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.