2016-05-12 73 views
0

我想通過DataSubscriber通過Fresco.G獲取gif,但是當我得到CloseableAnimatedImage時,我不知道如何獲取它的位圖。使用DataSubscriber加載gif的壁畫

public void getBitmap(String url, final OnBitmapFetchedListener listener) { 
      ImageRequest request = ImageRequest.fromUri(Uri.parse(url)); 

     final ImagePipeline imagePipeline = Fresco.getImagePipeline(); 
     DataSource<CloseableReference<CloseableImage>> 
       dataSource = imagePipeline.fetchDecodedImage(request, null); 

     DataSubscriber dataSubscriber = new BaseDataSubscriber<CloseableReference<CloseableImage>>() { 

      @Override 
      protected void onNewResultImpl(DataSource<CloseableReference<CloseableImage>> closeableReferenceDataSource) { 

       CloseableReference<CloseableImage> imageReference = closeableReferenceDataSource.getResult(); 
       if (imageReference != null) { 
        try { 
         CloseableImage image = imageReference.clone().get(); 
         if (image instanceof CloseableAnimatedImage) { 
          //here i get the gif but i don't know how to get the bitmap 
         }  
        } 
       } 
      } 

,我試過另一種方式來獲得一個PIC的位圖:

fun getBitmap(uri: Uri, listener: OnBitmapFetchedListener) { 
val request = ImageRequest.fromUri(uri) 

val imagePipeline = Fresco.getImagePipeline() 
val dataSource = imagePipeline.fetchEncodedImage(request, null) 

val dataSubscriber = object : BaseDataSubscriber<CloseableReference<PooledByteBuffer>>() { 

    override fun onNewResultImpl(closeableReferenceDataSource: DataSource<CloseableReference<PooledByteBuffer>>) { 

     val imageReference = closeableReferenceDataSource.result 
     if (imageReference != null) { 
      try { 
       val image = imageReference.clone().get() 

       val inputStream = PooledByteBufferInputStream(image) 

       val imageFormat = ImageFormatChecker.getImageFormat(inputStream) 

       Log.e("ImageUtil", "imageFormat = ${ImageFormat.getFileExtension(imageFormat)}") 
       val bitmap = BitmapFactory.decodeStream(inputStream) 

       listener.onSuccess(bitmap) 

      } catch (e: IOException) { 
       Log.e("ImageUtil", "error:$e") 
      } finally { 
       imageReference.close() 
      } 
     } 
    } 

    override fun onFailureImpl(closeableReferenceDataSource: DataSource<CloseableReference<PooledByteBuffer>>) { 
     Log.e("ImageUtil", "fail") 

     listener.onFail() 
    } 
} 

這是科特林碼,我用fetchEncodedImage並獲得PIC的InputStream的事。 但它總是繼續onFailImpl(),我不知道爲什麼。

+0

動畫圖像有幾個幀,而不僅僅是一個位圖。此外,這些幀會根據需要動態解碼。你想用這些位圖做什麼? – plamenko

+0

@plamenko我想要獲得gif的第一幀並展示它。 –

+0

爲什麼你不使用SimpleDraweeView? – plamenko

回答

0

看來,真正的問題是如何靜態顯示動畫圖像的第一幀。目前尚不支持,但實現起來非常容易。

壁畫已經有ImageDecodeOptions對象。你只需要在那裏添加另一個字段:public final boolean decodeAsStaticImage。然後在ImageDecoder.decodeGif你只需要改變:

if (GifFormatChecker.isAnimated(is)) { 
    return mAnimatedImageFactory.decodeGif(...); 
} 
return decodeStaticImage(encodedImage); 

到:

if (!options.decodeAsStaticImage && GifFormatChecker.isAnimated(is)) { 
    return mAnimatedImageFactory.decodeGif(...); 
} 
return decodeStaticImage(encodedImage); 

請隨時自由地實現這一點,做一個拉要求我們GitHub Fresco repository

然後在客戶端代碼中,您只需要將您的解碼選項設置爲ImageRequestBuilder.setImageDecodeOptions的圖像請求。