Picasso Tải hình ảnh từ hệ thống tệp


76

Tôi có thể sử dụng thư viện Picasso để tải hình ảnh từ hệ thống tệp không?

Tôi đang sử dụng startActivityForResultđể cho phép người dùng chọn ảnh từ thư viện của mình, sau đó muốn hiển thị hình ảnh đã chọn.

Tôi đã có mã làm việc để tải hệ thống tệp hình ảnh Uri, nhưng không thể làm cho Picasso.load()phương thức hoạt động.

Câu trả lời:


155

Tất nhiên bạn có thể. Nó thực sự khá thẳng về phía trước:

File f = new File("path-to-file/file.png");

hoặc là

File f = new File(uri);

Picasso.get().load(f).into(imageView);

cũng thế

Picasso.get().load(uri).into(imageView);

làm


8
Tôi không biết đó có phải là định dạng URI "cụ thể" mà Picasso yêu cầu để tải hình ảnh từ hệ thống tệp (ở định dạng Chuỗi) hay không. Nhưng tôi đã sử dụng cái được trả về từ ActivityResult và nó không hoạt động cho đến khi tôi chuyển một đối tượng Tệp, thay vì trực tiếp Chuỗi.
Gonan

6
Tôi đang cố gắng làm điều đó nhưng điều này không hoạt động, tôi đã nhận được Tệp từ một hoạt động khác vào bộ đệm ứng dụng của mình nhưng Picasso không tải nó ...
Loenix

1
câu trả lời patrickf của hiện các trick, tuy nhiên kể từ khi Picasso đã thay đổi một chút kể từ khi câu trả lời đã được đăng, bạn sẽ cần phải sử dụng cú pháp sau: Picasso.get().load(f).into(imageView); hoặc Picasso.get().load(uri).into(imageView); hoặc Picasso.get().load("http://i.imgur.com/DvpvklR.png").into(imageView);
Tom Larcher

27

Có bạn có thể.

Thử:

Picasso.with(context).load(new File(YOUR_FILE_PATH)).into(imageView);

BIÊN TẬP

Bạn cũng có thể gọi .load(YOUR_URI)thay thế.


23

Nhìn vào mã nguồn, tôi cũng phát hiện ra rằng bạn có thể tải hình ảnh từ hệ thống tệp thêm file:tiền tố chuỗi vào đường dẫn hình ảnh của bạn. Ví dụ:

file:path/to/your/image

Ngoài ra, khi sử dụng startActivityForResult, bạn sẽ nhận được một cái gì đó như sau:

Uri imageContent = data.getData();

Sau đó, bạn có thể gọi Picasso.with(getContext()).load(imageContent.toString).into(imageView);trực tiếp mà không cần tạo Cursorvà truy vấn đường dẫn hình ảnh.


3
Cảm ơn bạn, tính năng của tôi đã không hoạt động cho đến khi tôi thấy câu trả lời của bạn rằng cần có tiền tố "file:".
henrykodev

Tôi không biết tại sao nó không hoạt động. Đó là đường dẫn của tôi - "file: /storage/emulated/0/Android/data/com.fittingroom.newtimezone/files/default/AvatarPackage/DEFAULT_MY_AVATAR/pose1.jpeg", nhưng bất kỳ kết quả nào (
Aleksey Timoshchenko 23/02/17

1
@AlekseyTimoshchenko nên bắt đầu bằng file://. Uri của bạn bị thiếu thứ hai /.
Sufian

10

Thử cái này:

Picasso.with(context)
.load("file://"+path) // Add this
.config(Bitmap.Config.RGB_565)
.fit().centerCrop()
.into(imageView);

Nó hoạt động hoàn hảo đối với tôi.


mh, tôi sẽ sử dụng RGB_8888 trừ khi bạn có vấn đề với bộ nhớ hạn chế do hình ảnh là thực sự lớn
Zharf

6
> Picasso.get().load(R.drawable.landing_screen).into(imageView1);
> Picasso.get().load("file:///android_asset/DvpvklR.png").into(imageView2);
> Picasso.get().load(new File(...)).into(imageView3);

Đây là cách thực hiện với các phiên bản Picasso mới. Picasso.with()không còn nữa.
Inn0vative1

2

Về cơ bản, chúng ta cần ba thứ Context, image´s pathImageViewContainer

//Old version: Picasso.with(context).load("/files/my_image.jpg").into(myImageView);

 Picasso.get().load("/files/my_image.jpg").into(myImageView);

nhưng chúng tôi có thể sử dụng nhiều tùy chọn hơn:

  .resize(20, 20)
  .centerCrop()
  .placeholder(R.drawable.user_placeholder)
  .error(R.drawable.user_placeholder_error)

Vân vân...

thêm thông tin: http://square.github.io/picasso/


0

Nếu ai đó đang cố gắng làm điều này với Kotlin thì đây là ...

//biến

private lateinit var addImage: ImageView  // set the id of your ImageView
private lateinit var imageUri: Uri

// mở thư viện để chọn hình ảnh

val gallery = Intent()
        gallery.type = "image/*"
        gallery.action = Intent.ACTION_GET_CONTENT

        startActivityForResult(Intent.createChooser(gallery, "Select picture"), PICK_IMAGE)

//kế tiếp

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)
        if (requestCode == PICK_IMAGE && resultCode == RESULT_OK) {
            imageUri = data?.data!!
            try {

                Picasso.get()
                    .load(imageUri)
                    .into(addImage)

            } catch (e: Throwable) {
                e.printStackTrace()
            }
        }
    }

Đó là tất cả những gì bạn cần.

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.