Пікассо Завантажити зображення з файлової системи


76

Чи можу я використовувати бібліотеку Пікассо для завантаження зображень із файлової системи?

Я використовую, startActivityForResultщоб дозволити користувачеві вибрати фотографію зі своєї галереї, а потім хочу показати вибране зображення.

Я вже маю робочий код для отримання файлової системи зображень Uri, але не можу змусити Picasso.load()метод працювати.

Відповіді:


155

Звичайно, ви можете. Це насправді досить прямо:

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

або

File f = new File(uri);

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

також

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

робіт


8
Я не знаю, чи це "конкретний" формат URI, який Пікассо вимагає для завантаження зображень із файлової системи (у форматі String). Але я використав той, що повернувся з ActivityResult, і він не працював, поки я не передав об’єкт File, замість рядка безпосередньо.
Гонан

6
Я намагаюся це зробити, але це не працює, я отримав файл з іншої діяльності в кеш-пам’яті мого додатка, але Пікассо не завантажує його ...
Loenix

1
Відповідь patrickf в робить трюк, однак з Пікассо трохи змінилося , так як відповідь був відправлений, вам необхідно використовувати наступний синтаксис: Picasso.get().load(f).into(imageView); або Picasso.get().load(uri).into(imageView); або Picasso.get().load("http://i.imgur.com/DvpvklR.png").into(imageView);
Том Larcher

27

Так, ти можеш.

Спробуйте:

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

РЕДАГУВАТИ

Ви також можете зателефонувати .load(YOUR_URI)замість цього.


23

Переглядаючи вихідний код, я також виявляю, що ви можете завантажити зображення з файлової системи, додавши file:префікс рядка до шляху до вашого зображення. Наприклад:

file:path/to/your/image

Крім того, при використанні startActivityForResult ви отримаєте щось подібне:

Uri imageContent = data.getData();

Потім ви можете зателефонувати Picasso.with(getContext()).load(imageContent.toString).into(imageView);безпосередньо, не створюючи Cursorзапиту для шляху зображення.


3
Дякую, моя не працювала, поки я не побачив вашої відповіді, що потрібен префікс "file:".
henrykodev

Не знаю, чому це не працює. Існує мій шлях - "файл: /storage/emulated/0/Android/data/com.fittingroom.newtimezone/files/default/AvatarPackage/DEFAULT_MY_AVATAR/pose1.jpeg", але будь-який результат (
Олексій Тимощенко

1
@AlekseyTimoshchenko це слід починати з file://. У вашого Урі не вистачає другого /.
Суфіян

10

Спробуйте це:

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

Це ідеально підходить для мене.


mh, я б використовував RGB_8888, якщо у вас не виникають проблеми з обмеженнями пам’яті через те, що зображення справді велике
Жарф,

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

Це спосіб зробити це за допомогою нових версій Пікассо. Picasso.with()більше не доступні.
Inn0vative1

2

В основному нам потрібні три речі Context, image´s pathі ImageViewконтейнер

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

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

але ми можемо використати більше варіантів:

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

тощо ...

детальніше: http://square.github.io/picasso/


0

Якщо хтось намагається зробити це з Котліном, то ось він ...

// змінні

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

// відкрити галерею, щоб вибрати зображення

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

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

// наступний

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

Це все, що вам потрібно.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.