2015-09-14 10 views
5

Sto cercando di caricare un'immagine da un URL in una bitmap utilizzando la libreria Picasso, ma la maggior parte degli esempi che ho trovato si riferiscono al caricamento di una bitmap su ImageView o qualcosa di simile .Utilizzo di Picasso per caricare un'immagine in una bitmap

Il codice dovrebbe essere qualcosa come questo, secondo la documentazione.

public void loadImage() { 

     Picasso.with(getBaseContext()).load("image url").into(new Target() { 

      @Override 
      public void onPrepareLoad(Drawable arg0) { 
      } 
      @Override 
      public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom arg1) { 
       Bitmap bitImage = Bitmap(getApplicationContext(),bitmap); 
      } 
      @Override 
      public void onBitmapFailed(Drawable arg0) { 
      } 
     }); 
    } 

Ma Bitmap bitImage = Bitmap(getApplicationContext(),bitmap); non sembra essere corretta, dal momento che i `m ricevendo una chiamata di metodo errore previsto.

risposta

2

Sembra che non si sta creando il bitmap correttamente, ma se io fossi nella tua posizione vorrei creare una bitmap in scala in questo modo:

public Bitmap getResizedBitmap(Bitmap bm, int newWidth, int newHeight) { 
    int width = bm.getWidth(); 
    int height = bm.getHeight(); 
    float scaleWidth = ((float) newWidth)/width; 
    float scaleHeight = ((float) newHeight)/height; 
    // CREATE A MATRIX FOR THE MANIPULATION 
    Matrix matrix = new Matrix(); 
    // RESIZE THE BIT MAP 
    matrix.postScale(scaleWidth, scaleHeight); 

    // "RECREATE" THE NEW BITMAP 
    Bitmap resizedBitmap = Bitmap.createBitmap(
    bm, 0, 0, width, height, matrix, false); 
    bm.recycle(); 
    return resizedBitmap; 
} 

quindi impostarlo su un IMAGEVIEW in questo modo:

mImg.setImageBitmap(img); 

complesso sarebbe simile a questa:

public void loadImage() { 

    Picasso.with(getBaseContext()).load("image url").into(new Target() { 
      // .... 

      @Override 
      public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom arg1) { 
       // Pick arbitrary values for width and height 
       Bitmap resizedBitmap = getResizedBitmap(bitmap, newWidth, newHeight); 
       mImageView.setBitmap(resizedBitmap); 
      } 

      // .... 
     }); 
    } 
} 

public Bitmap getResizedBitmap(Bitmap bm, int newWidth, int newHeight) { 
    int width = bm.getWidth(); 
    int height = bm.getHeight(); 
    float scaleWidth = ((float) newWidth)/width; 
    float scaleHeight = ((float) newHeight)/height; 
    // CREATE A MATRIX FOR THE MANIPULATION 
    Matrix matrix = new Matrix(); 
    // RESIZE THE BIT MAP 
    matrix.postScale(scaleWidth, scaleHeight); 

    // "RECREATE" THE NEW BITMAP 
    Bitmap resizedBitmap = Bitmap.createBitmap(
    bm, 0, 0, width, height, matrix, false); 
    bm.recycle(); 
    return resizedBitmap; 
} 

Ma io interrogherò utilizzando Target del tutto, di solito è per un caso molto specializzato. Dovresti chiamare il singleton di Picasso nella stessa classe in cui visualizzi le immagini. Di solito questo è in una Adapter (RecyclerView adattatore forse) in questo modo:

Picasso.with(mContext) 
    .load("image url") 
    .into(mImageView); 
+0

Grazie, ho già i metodi in vigore per il ridimensionamento (http://developer.android.com/training/displaying-bitmaps/load-bitmap .html). Avevo solo bisogno di caricare un'immagine da un URL in una bitmap (non direttamente in un ImageView), calcolata dai commenti sopra. Molte grazie. – Alex

+0

Perché si sta utilizzando un'attività asincrona per caricare l'immagine. È possibile implementare semplicemente una richiamata nel .into (mImageView, new Callback <> {...}); – AndyRoid

+0

In realtà, stavo cercando un modo rapido per caricare un'immagine in una bitmap che verrà quindi passata a una scheda (RecycleView), invece di caricarla dalla cartella delle risorse. Sto cercando di eseguire il debug di un problema descritto qui http://stackoverflow.com/questions/32554358/encountering-lag-when-updating-a-cardview-item-in-a-recycleview. Probabilmente cercherò di caricare l'immagine nella classe in cui verrà visualizzata. Ma penso che Picasso possa essere usato solo in una classe di attività, o almeno questo è ciò che ho capito da alcuni post. E presumo di aver bisogno di passare Context alla classe Adapter, giusto? – Alex

Problemi correlati