Tạo một Bitmap / Có thể vẽ từ đường dẫn tệp


83

Tôi đang cố tạo Bitmap hoặc Drawable từ đường dẫn tệp hiện có.

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

Nhưng setImageBitmap(), setImageDrawable()không hiển thị hình ảnh từ đường dẫn. Tôi đã in đường dẫn với mTextvà nó trông giống như:/storage/sdcard0/DCIM/100LGDSC/CAM00001.jpg

Tôi đang làm gì sai? Bất cứ ai có thể giúp tôi?


BitmapFactory.decodeFile (path) -> điều này có trả về một đối tượng Bitmap cho bạn không? bạn có thể xác minh nó?
toantran

1
@ autobot_101 trong chế độ gỡ lỗi, nó có idtrong mBuffer. Nhưng nó mHeight, mWidthgiá trị -1, và mLayoutBoundsnull.
Nari Kim Shin

Sau đó, bạn nên kiểm tra lại đường dẫn tệp của mình, vì điều đó có nghĩa là hình ảnh của bạn chưa được 'thổi phồng' lên đối tượng bitmap. Có lẽ bạn có thể thử một hình ảnh khác
toantran

1
@ autobot_101 thực sự tôi đã lấy đường dẫn hình ảnh này Cursorvà thử các hình ảnh khác, nhưng kết quả tương tự. Ngoài ra, tôi đã kiểm tra đường dẫn qua adb shellvà phát hiện ra hình ảnh tồn tại trong đường dẫn đó.
Nari Kim Shin

Câu trả lời:


140

Tạo bitmap từ đường dẫn tệp:

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

Nếu bạn muốn chia tỷ lệ bitmap theo chiều cao và chiều rộng của cha mẹ thì hãy sử dụng Bitmap.createScaledBitmaphàm.

Tôi nghĩ rằng bạn đang đưa sai đường dẫn tệp. :) Hi vọng điêu nay co ich.


1
Tôi đã có giải pháp của mình từ lâu, nhưng tôi sẽ coi đây là một câu trả lời chính xác vì nó cũng có thể xử lý lỗi OOM khi bạn đang tải một hình ảnh quy mô lớn. Giải pháp rất sạch sẽ và tốt đẹp! Cảm ơn!
Nari Kim Shin

1
Tôi giả sử imageName ở đây là bất kỳ chuỗi nào? hoặc là bất kỳ imageName cụ thể nào?
Jeet

@JeetendraChoudhary Có imageName có thể là bất kỳ Chuỗi cuối cùng nào làm tên của hình ảnh.
CodeShadow

61

Nó hoạt động cho tôi:

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

}

Biên tập:

Nếu thư mục sdcard mã hóa cứng ở trên không hoạt động trong trường hợp của bạn, bạn có thể tìm nạp đường dẫn sdcard:

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

3
Hãy thử lấy con đường sdcard từ Environment.getExternalStorageDirectory().toString()và sau đó thử
Antarix


3

Chà, với tôi, việc sử dụng static Drawable.createFromPath(String pathName)có vẻ đơn giản hơn một chút so với việc tự giải mã nó ... :-)

Nếu của bạn mImglà một đơn giản ImageView, bạn thậm chí không cần nó, sử dụng mImg.setImageUri(Uri uri)trực tiếp.


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
Lưu ý rằng bạn nên giải thích mã mà bạn cung cấp trong câu trả lời.
Daniel Nugent

0

bạn không thể truy cập các đồ có thể kéo của mình thông qua một đường dẫn, vì vậy nếu bạn muốn một giao diện có thể đọc được với các đồ có thể kéo của mình mà bạn có thể xây dựng theo chương trình.

khai báo một HashMap ở đâu đó trong lớp của bạn:

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
  }
}

Bây giờ để truy cập -

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);
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.