2016-08-03 1 views
2

J'essaye d'obtenir l'image bitmap de SimpleDraweeView.Obtenir bitmapdrawable de fresque

Je l'ai déjà setted mon SimpleDraweeView avec l'image uri:

final Uri uri = new Uri.Builder() 
        .scheme(UriUtil.LOCAL_RESOURCE_SCHEME) 
        .path(returnUri.getPath()) 
        .build(); 
      profileImage.setImageURI(returnUri); 

Et maintenant, je suis en train d'enregistrer l'image dans la mémoire (stockage) du téléphone.

Bitmap b = ((BitmapDrawable) profileImage.getDrawable()).getBitmap(); // ImageDiskHelper.drawableToBitmap(profileImage.getDrawable().get); 
     try { 
      ImageDiskHelper.saveToInternalStorage(b, "MyActualProfileImage"); 
     } catch(Exception c){ } 

Mais si j'utilise le code ci-dessus je suis: com.facebook.drawee.generic.RootDrawable ne peut pas être jeté à android.graphics.drawable.BitmapDrawable

je convertir profileImage.getDrawable à l'image bitmap est comme ceci: empty image

J'essaie d'obtenir le bitmap qui est affiché par le SimpleDraweeView

+0

Pourquoi voulez-vous exactement cela? Fresco gère déjà toute la mise en cache, etc. pour vous. –

+0

@AlexanderOprisnik Une bonne raison pour laquelle je peux penser est pour le test de l'interface utilisateur, il est utile d'avoir accès à un bitmap drawable, mais pour ce faire, nous devons commencer par un drawable régulier, et je ne sais pas comment le faire –

+0

Parce que je veux que l'utilisateur voit une image, puis l'enregistrer dans le stockage –

Répondre

0

obtenir le drawable bitmap n'est pas une bonne idée puisque la mise en œuvre sous-jacente de Fresco pourrait changer dans les futu re, ce qui briserait votre code.

Je suppose que vous voulez vraiment juste les octets d'image cryptés (de sorte que vous n'avez pas à ré-encoder l'image). Vous pouvez obtenir les octets d'image codées avec

DataSource<CloseableReference<PooledByteBuffer>> dataSource = imagePipeline.fetchEncodedImage(imageRequest, callerContext);

Puisque vous avez déjà pris l'image avant, il devrait être disponible instantanément et vous pouvez faire quelque chose comme

try { 
    CloseableReference<PooledByteBuffer> encodedImage = dataSource.getResult(); 
    if (imageReference != null) { 
    try { 
     // Do something with the encoded image, but do not keep the reference to it! 
     // The image may get recycled as soon as the reference gets closed below. 
    } finally { 
     CloseableReference.closeSafely(encodedImage); 
    } 
    } else { 
    // cache miss 
    ... 
    } 
} finally { 
    dataSource.close(); 
} 

Ne pas oublier de fermer les références afin que vous ne fuyez pas la mémoire. Vous pouvez trouver plus d'informations: here.

0

Je pense que cela peut vous aider.

SimpleDraweeView view = findView(R.id.pic); 
view.setDrawingCacheEnabled(true); 
view.buildDrawingCache(); 
Bitmap bitmap = view.getDrawingCache(); 
if (bitmap != null) { 
    dominantColor = getDominantColor(bitmap); 
} 

Peut-être que ce n'est pas une belle solution, mais qui fonctionne bien pour moi.