Obtener Bitmap de ImageView cargado con Picasso

Tenía un método que carga imágenes, si la imagen no se ha cargado antes de que lo busque en un servidor. Luego lo almacena en el sistema de archivos de aplicaciones. Si se encuentra en el sistema de archivos carga esa imagen en su lugar, ya que es mucho más rápido que tirar de las imágenes desde el servidor. Si ha cargado la imagen antes sin cerrar la aplicación, se almacenará en un diccionario estático para que pueda volver a cargarse sin utilizar más memoria, para evitar errores de memoria.

Todo funcionó bien hasta que empecé a usar la biblioteca de carga de imágenes de Picasso. Ahora estoy cargando imágenes en un ImageView, pero no sé cómo obtener el mapa de bits que se devuelve para que pueda almacenar en un archivo o el diccionario estático. Esto ha hecho las cosas más difíciles. Porque significa que intenta cargar la imagen del servidor cada vez, que es algo que no quiero que suceda. ¿Hay una manera de obtener el mapa de bits después de cargarlo en el ImageView? A continuación se muestra mi código:

public Drawable loadImageFromWebOperations(String url, final String imagePath, ImageView theView, Picasso picasso) { try { if (Global.couponBitmaps.get(imagePath) != null) { scaledHeight = Global.couponBitmaps.get(imagePath).getHeight(); return new BitmapDrawable(getResources(), Global.couponBitmaps.get(imagePath)); } File f = new File(getBaseContext().getFilesDir().getPath() .toString() + "/" + imagePath + ".png"); if (f.exists()) { picasso.load(f).into(theView); **This line below was my attempt at retrieving the bitmap however it threw a null pointer exception, I assume this is because it takes a while for Picasso to add the image to the ImageView** Bitmap bitmap = ((BitmapDrawable)theView.getDrawable()).getBitmap(); Global.couponBitmaps.put(imagePath, bitmap); return null; } else { picasso.load(url).into(theView); return null; } } catch (OutOfMemoryError e) { Log.d("Error", "Out of Memory Exception"); e.printStackTrace(); return getResources().getDrawable(R.drawable.default1); } catch (NullPointerException e) { Log.d("Error", "Null Pointer Exception"); e.printStackTrace(); return getResources().getDrawable(R.drawable.default1); } } 

Cualquier ayuda sería muy apreciada, gracias!

Con Picasso no necesitas implementar tu propio diccionario estático porque se hace automáticamente para ti. @intrepidkarthi tenía razón en el sentido de que las imágenes son automáticamente almacenadas en caché por Picasso la primera vez que se cargan y por lo que no constantemente llamar al servidor para obtener la misma imagen.

Dicho esto, me encontré en una situación similar: Necesitaba acceder al mapa de bits que se descargó para almacenarlo en algún otro lugar de mi aplicación. Para eso, puse un poco la respuesta de @Gilad Haimov:

  Picasso.with(this) .load(url) .into(new Target() { @Override public void onBitmapLoaded (final Bitmap bitmap, Picasso.LoadedFrom from) { /* Save the bitmap or do something with it here */ //Set it in the ImageView theView.setImageBitmap(bitmap); } @Override public void onPrepareLoad(Drawable placeHolderDrawable) {} @Override public void onBitmapFailed(Drawable errorDrawable) {} }); 

Esto le da acceso al mapa de bits cargado mientras lo carga de forma asíncrona. Sólo tiene que recordar para establecerlo en el ImageView ya que ya no se hace automáticamente para usted.

En una nota lateral, si está interesado en saber de dónde viene su imagen, puede acceder a esa información dentro de ese mismo método. El segundo argumento del método anterior, Picasso.LoadedFrom from , es un enum que le permite saber de qué fuente se cargó el mapa de bits (las tres fuentes son DISK , MEMORY y NETWORK .) ( Source ). Visual de cómo se ha cargado el mapa de bits utilizando los indicadores de depuración explicados aquí .

Espero que esto ayude !

Picasso le da control directo sobre las imágenes descargadas. Para guardar las imágenes descargadas en el archivo haga algo como esto:

 Picasso.with(this) .load(currentUrl) .into(saveFileTarget); 

Dónde:

 saveFileTarget = new Target() { @Override public void onBitmapLoaded (final Bitmap bitmap, Picasso.LoadedFrom from){ new Thread(new Runnable() { @Override public void run() { File file = new File(Environment.getExternalStorageDirectory().getPath() + "/" + FILEPATH); try { file.createNewFile(); FileOutputStream ostream = new FileOutputStream(file); bitmap.compress(CompressFormat.JPEG, 75, ostream); ostream.close(); } catch (Exception e) { e.printStackTrace(); } } }).start(); } } 

Puesto que usted está usando Picasso, también puede querer aprovechar al máximo de ella. Incluye un poderoso mecanismo de caché.

Utilice picasso.setDebugging(true) en su instancia de Picasso para ver qué tipo de almacenamiento en caché ocurre (las imágenes se cargan desde el disco, la memoria o la red). Ver: http://square.github.io/picasso/ (depurar indicadores)

La instancia predeterminada de Picasso se configura con ( http://square.github.io/picasso/javadoc/com/squareup/picasso/Picasso.html#with-android.content.Context- )

Caché de memoria LRU del 15% de la RAM de la aplicación disponible

Caché de disco de 2% de espacio de almacenamiento de hasta 50 MB, pero no menos de 5 MB. (Nota: esto sólo está disponible en la API 14+ o si está utilizando una biblioteca independiente que proporciona una caché de disco en todos los niveles de API como OkHttp)

También puede especificar su instancia de Cache utilizando Picasso.Builder para personalizar su instancia y puede especificar su Downloader para un control más Picasso.Builder . (Hay una implementación de OkDownloader en Picasso que se utiliza automáticamente si incluye OkHttp en su aplicación).

En este ejemplo, utilicé para establecer el fondo de una barra de herramientas de colapsar.

 public class MainActivity extends AppCompatActivity { CollapsingToolbarLayout colapsingToolbar; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); colapsingToolbar = (CollapsingToolbarLayout) findViewById(R.id.colapsingToolbar); ImageView imageView = new ImageView(this); String url ="www.yourimageurl.com" Picasso.with(this) .load(url) .resize(80, 80) .centerCrop() .into(image); colapsingToolbar.setBackground(imageView.getDrawable()); } 

Espero que te ayude.

Utilizar esta

 Picasso.with(context) .load(url) .into(imageView new Callback() { @Override public void onSuccess() { //use your bitmap or something } @Override public void onError() { } }); 

Espero que te ayude

  • Picasso: cómo cancelar todas las peticiones de imagen hechas en un adaptador
  • Android: falla en la imagen de carga de Picasso. Cómo mostrar mensaje de error
  • Picasso java.lang.IllegalStateException: La llamada al método no debería ocurrir desde el hilo principal
  • Cómo agregar cuadros a la imagen?
  • Android picasso, razón de error
  • Buscar imágenes con Callback en Picasso?
  • Picasso carga de imagen de devolución de llamada
  • Picasso "Cambiar tamaño y centerCrop" o ImageView "centerCrop"?
  • Solución local de caché de imágenes para Android: Square Picasso vs Universal Image Loader
  • Clear Disk / SD Card Cache de la Biblioteca de imágenes de Picasso de Android
  • Cómo borrar la caché de imágenes de Picasso
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.