2014-07-10 18 views
10

Görüntü sunucuya bakmadan önce resim yüklenmemişse, görüntüleri yükleyen bir yöntem kullanmıştım. Daha sonra uygulama dosya sisteminde saklar. Dosya sistemindeyse, görüntüyü sunucudan çekmekten çok daha hızlı olduğu için bu görüntüyü yükler. Uygulamayı kapatmadan önce görüntüyü yüklediyseniz, bellek hatalarından kaçınmak için daha fazla bellek kullanmadan yeniden yüklenebilecek şekilde statik bir sözlükte depolanır.Picasso ile yüklenen ImageView'dan Bitmap alın

Bu, Picasso görüntü yükleme kitaplığını kullanmaya başladığım kadar iyi çalıştı. Şimdi görüntüleri bir ImageView'e yüklüyorum, ancak bir dosyaya veya statik sözlüğe kaydedebilmem için döndürülen Bitmap'i nasıl alacağımı bilmiyorum. Bu işleri daha da zorlaştırdı. çünkü görüntüyü sunucudan her seferinde yüklemeyi deniyor, ki olmasını istemediğim bir şey. ImageView içine yükledikten sonra Bitmap'i elde etmenin bir yolu var mı? Aşağıda benim kodum:

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

Herhangi bir yardım çok takdir edilecektir, teşekkür ederim!

+0

Picasso, görüntüleri her zaman Sunucudan yüklemez. Sadece ilk kez önbellek dizininden yüklenir. – intrepidkarthi

cevap

7

Picasso, indirilen görüntüler üzerinde doğrudan denetim sağlar. dosyasına yüklenen görüntüleri kaydetmek için böyle bir şey yapmak:

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(); 
    } 
} 
+0

Bu ayrıca bir Çizim ile yapılabilir mi? (Ben bir EditText eklemek için tp çalışıyorum) Ben herhangi bir hata almadım ama çalışmıyor – Sauron

0

Eğer Picasso kullandığınıza göre, siz de bunun tam olarak yararlanmak isteyebilirsiniz:

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

. Güçlü bir önbellek mekanizması içerir.

Picasso örneğinde, ne tür bir önbelleklenmenin gerçekleştiğini (görüntüler diskten, bellekten veya ağdan yüklendiğini) görmek için picasso.setDebugging(true) örneğini kullanın. Bakınız: http://square.github.io/picasso/ (ayıklama göstergeleri)

Picasso varsayılan örnek (http://square.github.io/picasso/javadoc/com/squareup/picasso/Picasso.html#with-android.content.Context-)

LRU önbellek% 15 mevcut uygulama RAM kadar

Disk önbelleği% 2 depolama alanı arasında yapılandırılmış olan 50MB'a kadar ama 5MB'den az değil. (Not: Bu API 14+ yalnızca mevcuttur veya OkHttp gibi tüm API düzeyleri üzerinde bir disk önbelleği sağlayan bağımsız bir kütüphane kullanıyorsanız)

Ayrıca örneğini özelleştirmek için Picasso.Builder kullanarak Cache örneğini belirtebilirsiniz ve daha ince kontrol için Downloader'u belirtebilirsiniz. (Uygulamanızda OkHttp'u dahil ederseniz, otomatik olarak kullanılan OkDownloader uygulamasının bir uygulaması vardır.)

34

Picasso ile sizin için otomatik olarak yapıldığı için kendi statik sözlüğünüzü uygulamanız gerekmez. @intrepidkarthi, görüntülerin Picasso tarafından ilk kez yüklendiklerinde otomatik olarak önbelleğe alındığı ve bu nedenle aynı görüntüyü almak için sunucuyu sürekli aramayacağı konusunda haklıydı.

Bu, kendimi benzer bir durumda buldum: Uygulamamda başka bir yerde saklamak için indirilen bitmap'e erişmem gerekiyordu.

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

Bu hala uyumsuz olarak yüklenirken, yüklenen bitmap erişmenizi sağlar: Bunun için, ben @Gilad Haimov cevabı biraz tweaked.Artık sizin için otomatik olarak yapılmadığından ImageView'de ayarlamanız gerektiğini unutmayın.

Bir yan notta, görüntünüzün nereden geldiğini bilmek istiyorsanız, bu bilgilere aynı yöntemle erişebilirsiniz. Yukarıdaki yöntemin ikinci argümanı olan Picasso.LoadedFrom from, bitmap'in hangi kaynaktan yüklendiğini (üç kaynak DISK, MEMORY ve . (Source) bilmenizi sağlayan bir enumdur. ayıklama göstergelerini kullanarak bitmap yüklenen nerede görerek here açıkladı.

Umut bu yardımcı olur!

-1

kullanın bu

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

    @Override 
    public void onError() { 

    } 
}); 

size

yardımcı Umut
+2

'onSuccess()' Bitmap nesnesini sağlamaz. – Hemanth

+0

Hemanth, Target'i dönüştürmek veya kullanmak. Hedef bitmap sağlar! – Madi

0

Bu örnekte, bir colapsing araç çubuğunun arka planını ayarlamak için kullanılır.

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

} 

Umarım size yardımcı olmuştur.

İlgili konular