2015-04-06 16 views
9

Picasso'yu Android uygulamasında Fresco ile değiştirmeye çalışıyorum. Ancak, sadece Fresco kullanarak bir bitmap'i nasıl yükleyeceğinden emin değilim.Bir bitmap'i yüklemek için Facebook'un Fresk'unu kullanma

Picasso ile aşağıdakileri yapardım.

Bitmap poster = Picasso.with(getActivity()) 
        .load(url) 
        .resize(Utils.convertDpToPixel(WIDTH,HEIGHT)) 
        .centerCrop() 
        .get(); 

Bu Fresk ile bir Bitmap oluşturmanın nasıl olduğunu anlayamadım. Herhangi bir fikir?

+0

AFAIK Fresco standart Bitmap sınıfı ziyade kendi uygulanmasında dayanmaz çünkü bu kütüphaneleri takas için dümdüz bir yol yoktur. –

cevap

2

Bunun için doğrudan Fresco'nun görüntü boru hattı kullanır:

http://frescolib.org/docs/using-image-pipeline.html

rağmen Eğer sormamın bir sakıncası yoksa - motivasyon burada nedir? Neden Bitmap'in kendisine ihtiyacınız var? Fresco gibi

+1

Görüntüyü SD'ye kaydetmek ve yolunu örneğin bir yerel 'SQLight' veritabanına yazmak isteyebilirsiniz. Ayrıca, daha sonraki amaçlar için orijinal çözünürlük görüntüsünü de isteyebilirsiniz. Yukarıdaki örnekte .resize() işlevi, yeniden boyutlandırılan bir görüntü verecektir (Fresco'nun aynı şeyi yapıp yapamayacağından emin değilsiniz, ancak görüntülerin yeniden boyutlandırılmasının nedeni budur. Picasso kullanırken kendimi. – Droidman

+2

Eminim Fresco'ya yeni projelerimde denemem gerektiğinden emin olmak için sadece IMHO, indirilen görüntüye bir Bitmap nesnesi olarak (veya doğrudan manipüle edebileceğiniz başka bir format) erişilmesi önemli bir özelliktir. birçok geliştirici görmek isteyebilir – Droidman

+0

Google Maps API için bir harita işaretçisi oluşturmak için referansa ihtiyacım var (örneğin) – Kenny

17

ki: -:

dataSource.subscribe(new BaseBitmapDataSubscriber() { 
    @Override 
    public void onNewResultImpl(@Nullable Bitmap bitmap) { 
     // You can use the bitmap in only limited ways 
     // No need to do any cleanup. 
    } 

    @Override 
    public void onFailureImpl(DataSource dataSource) { 
     // No cleanup required here. 
    } 
    }, 
    executor); 

yapabilirsiniz boru hattına isteğiniz şifresi çözülmüş bir görüntü için ise

bir Android Bitmap, bizim daha kolay kullanımlı BaseBitmapDataSubscriber yararlanabilir bitmap'i onNewResultImpl yönteminin kapsamında olmayan herhangi bir değişkene atamayın.

http://frescolib.org/docs/datasources-datasubscribers.html#_

Kodum:

public void setDataSubscriber(Context context, Uri uri, int width, int height){ 
    DataSubscriber dataSubscriber = new BaseDataSubscriber<CloseableReference<CloseableBitmap>>() { 
     @Override 
     public void onNewResultImpl(
       DataSource<CloseableReference<CloseableBitmap>> dataSource) { 
      if (!dataSource.isFinished()) { 
       return; 
      } 
      CloseableReference<CloseableBitmap> imageReference = dataSource.getResult(); 
      if (imageReference != null) { 
       final CloseableReference<CloseableBitmap> closeableReference = imageReference.clone(); 
       try { 
        CloseableBitmap closeableBitmap = closeableReference.get(); 
        Bitmap bitmap = closeableBitmap.getUnderlyingBitmap(); 
        if(bitmap != null && !bitmap.isRecycled()) { 
         //you can use bitmap here 
        } 
       } finally { 
        imageReference.close(); 
        closeableReference.close(); 
       } 
      } 
     } 
     @Override 
     public void onFailureImpl(DataSource dataSource) { 
      Throwable throwable = dataSource.getFailureCause(); 
      // handle failure 
     } 
    }; 
    getBitmap(context, uri, width, height, dataSubscriber); 
} 

/** 
* 
* @param context 
* @param uri 
* @param width   
* @param height   
* @param dataSubscriber 
*/ 
public void getBitmap(Context context, Uri uri, int width, int height, DataSubscriber dataSubscriber){ 
    ImagePipeline imagePipeline = Fresco.getImagePipeline(); 
    ImageRequestBuilder builder = ImageRequestBuilder.newBuilderWithSource(uri); 
    if(width > 0 && height > 0){ 
     builder.setResizeOptions(new ResizeOptions(width, height)); 
    } 
    ImageRequest request = builder.build(); 
    DataSource<CloseableReference<CloseableImage>> 
      dataSource = imagePipeline.fetchDecodedImage(request, context); 
    dataSource.subscribe(dataSubscriber, UiThreadExecutorService.getInstance()); 
} 
+0

Bildiğimiz gibi, yeniden boyutlandırma seçeneği png veya gif ve benzeri olduğunda sadece jpeg için çalışır şeyler, fresk mükemmel bir şekilde başa çıkamaz. Bu yüzden sadece bitmap'i yeniden boyutlandırmak ve Fresco ile yüklemek istiyorum. Ama bir uri değil bir bitmap yüklemek için fresk kullanmayı bilmiyorum. Fresco'yu yüklemek için kullanmamın nedeni, önbellek kullanmaktır. –

İlgili konular