2016-05-12 30 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的图像请求。