फ़ाइल पथ से एक बिटमैप / ड्राएबल बनाएँ


84

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

String path = intent.getStringExtra("FilePath");
BitmapFactory.Options option = new BitmapFactory.Options();
option.inPreferredConfig = Bitmap.Config.ARGB_8888;

mImg.setImageBitmap(BitmapFactory.decodeFile(path));
// mImg.setImageBitmap(BitmapFactory.decodeFile(path, option));
// mImg.setImageDrawable(Drawable.createFromPath(path));
mImg.setVisibility(View.VISIBLE);
mText.setText(path);

लेकिन setImageBitmap(), setImageDrawable()पथ से एक छवि नहीं दिखाता है। मैंने पथ मुद्रित किया है mTextऔर ऐसा दिखता है:/storage/sdcard0/DCIM/100LGDSC/CAM00001.jpg

मैं क्या गलत कर रहा हूं? कोई मुझे मदद कर सकता है?


BitmapFactory.decodeFile (पथ) -> क्या यह आपके लिए एक बिटमैप ऑब्जेक्ट लौटाता है? क्या आप इसे सत्यापित कर सकते हैं?
तंवर

1
@ डिबग मोड में autobot_101, यह है idमें mBuffer। लेकिन इसका mHeight, mWidthमूल्य है -1, और mLayoutBoundsहै null
नारी किम शिन

फिर आपको अपने फ़ाइल पथ को फिर से जांचना चाहिए, क्योंकि इसका मतलब है कि आपकी छवि बिटमैप ऑब्जेक्ट को 'फुलाया' नहीं गया है। शायद तुम एक और छवि कोशिश कर सकते हैं
toantran

1
@ autobot_101 वास्तव में मुझे यह छवि पथ से मिली Cursorऔर अन्य छवियों की कोशिश की, लेकिन वही परिणाम। इसके अलावा, मैंने पथ की जाँच की adb shellऔर पाया कि चित्र उस पथ में मौजूद हैं।
नारी किम शिन

जवाबों:


142

फ़ाइल पथ से बिटमैप बनाएँ:

File sd = Environment.getExternalStorageDirectory();
File image = new File(sd+filePath, imageName);
BitmapFactory.Options bmOptions = new BitmapFactory.Options();
Bitmap bitmap = BitmapFactory.decodeFile(image.getAbsolutePath(),bmOptions);
bitmap = Bitmap.createScaledBitmap(bitmap,parent.getWidth(),parent.getHeight(),true);
imageView.setImageBitmap(bitmap);

यदि आप बिटमैप को माता-पिता की ऊंचाई और चौड़ाई में मापना चाहते हैं, तो Bitmap.createScaledBitmapफ़ंक्शन का उपयोग करें।

मुझे लगता है कि आप गलत फ़ाइल पथ दे रहे हैं। :) उम्मीद है की यह मदद करेगा।


1
मुझे अपना समाधान बहुत पहले ही मिल गया था, लेकिन मैं इसे एक सही उत्तर के रूप में लूंगा क्योंकि आप बड़े पैमाने पर छवि लोड करते समय ओओएम त्रुटियों को भी संभाल सकते हैं। बहुत साफ और अच्छा समाधान! धन्यवाद!
नारी किम शिन

1
मुझे लगता है कि छवि यहाँ किसी भी स्ट्रिंग है? या यह कोई विशिष्ट छवि है?
जीत

@ जीतेंद्रचौधरी जी हां छवि का नाम छवि के नाम के रूप में कोई भी अंतिम स्ट्रिंग हो सकता है।
कोडशॉ नोव

61

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

File imgFile = new  File("/sdcard/Images/test_image.jpg");
if(imgFile.exists()){
    Bitmap myBitmap = BitmapFactory.decodeFile(imgFile.getAbsolutePath());
    //Drawable d = new BitmapDrawable(getResources(), myBitmap);
    ImageView myImage = (ImageView) findViewById(R.id.imageviewTest);
    myImage.setImageBitmap(myBitmap);

}

संपादित करें:

यदि हार्ड-कोडित sdcard निर्देशिका से ऊपर आपके मामले में काम नहीं कर रहा है, तो आप sdcard पथ प्राप्त कर सकते हैं:

String sdcardPath = Environment.getExternalStorageDirectory().toString();
File imgFile = new  File(sdcardPath);

3
से SdCard पथ प्राप्त करने का प्रयास करें Environment.getExternalStorageDirectory().toString()और फिर प्रयास करें
Antarix


3

ठीक है, स्थैतिक का उपयोग करते हुए Drawable.createFromPath(String pathName)मुझे खुद को डिकोड करने की तुलना में थोड़ा अधिक सीधा लगता है ... :-)

यदि आपका mImgएक सरल है ImageView, तो आपको इसकी आवश्यकता भी नहीं है, mImg.setImageUri(Uri uri)सीधे उपयोग करें।


1
static ArrayList< Drawable>  d;
d = new ArrayList<Drawable>();
for(int i=0;i<MainActivity.FilePathStrings1.size();i++) {
  myDrawable =  Drawable.createFromPath(MainActivity.FilePathStrings1.get(i));
  d.add(myDrawable);
}

4
ध्यान दें कि आपको उस कोड की व्याख्या करनी चाहिए जो आप एक उत्तर में प्रदान करते हैं।
डैनियल नुगेंट

0

यदि आप एक मानवीय पठनीय अंतरफलक चाहते हैं, तो आप अपने ड्रॉएबल्स के साथ एक पथ के माध्यम से अपने ड्रॉबल्स का उपयोग नहीं कर सकते हैं।

अपनी कक्षा में कहीं एक हैशपेयर घोषित करें:

private static HashMap<String, Integer> images = null;

//Then initialize it in your constructor:

public myClass() {
  if (images == null) {
    images = new HashMap<String, Integer>();
    images.put("Human1Arm", R.drawable.human_one_arm);
    // for all your images - don't worry, this is really fast and will only happen once
  }
}

अब उपयोग के लिए -

String drawable = "wrench";
// fill in this value however you want, but in the end you want Human1Arm etc
// access is fast and easy:
Bitmap wrench = BitmapFactory.decodeResource(getResources(), images.get(drawable));
canvas.drawColor(Color .BLACK);
Log.d("OLOLOLO",Integer.toString(wrench.getHeight()));
canvas.drawBitmap(wrench, left, top, null);
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.