2016-05-12 11 views
0

Fresco.ButでDataSubscriberを使用してGIFを取得したいのですが、CloseableAnimatedImageを取得すると、そのビットマップを取得する方法がわかりません。Fresco 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を取得している何をすべきか、kotlinコードです。 しかし、それは常に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の画像リクエストに設定するだけで済みます。

関連する問題