2016-08-03 5 views
2

Ich versuche, das Bitmap von SimpleDraweeView zu bekommen.Bitmapdrawable von fresco erhalten

ich gefasst schon meinen SimpleDraweeView mit uri Bild:

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

Und jetzt versuche ich das Bild im Speicher (Speicher) des Telefons zu speichern.

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

Aber wenn ich den Code verwenden oben erhalte ich: com.facebook.drawee.generic.RootDrawable nicht android.graphics.drawable.BitmapDrawable gegossen werden kann

ich konvertieren profileImage.getDrawable das Bild in Bitmap das ist wie: empty image

ich versuche, das Bitmap zu erhalten, die durch die SimpleDraweeView

+0

Warum genau möchten Sie das tun? Fresco verwaltet bereits alle Caches etc. für Sie. –

+0

@AlexanderOprisnik Ein guter Grund, den ich denken kann, ist für UI-Tests ist es nützlich, Zugriff auf eine Bitmap-Zeichen haben, aber dazu müssen wir mit einem regulären Zeichen beginnen scheint es, und ich weiß nicht, wie man das –

+0

zu werfen Weil ich dem Benutzer ein Bild anzeigen lassen möchte, speichern Sie es im Speicher –

Antwort

0

die Bitmap ziehbar ist in dem futu ändern konnte nicht Fresko, da die zugrunde liegende Implementierung der eine gute Idee Erste angezeigt wird re, die deinen Code brechen würde.

Ich denke, Sie wollen wirklich nur die rohen kodierten Bild-Bytes (so dass Sie das Bild nicht neu kodieren müssen). Sie können die kodierten Bild Bytes erhalten mit

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

Da Sie bereits das Bild geholt vor, sollte es verfügbar sein sofort und Sie können wie etwas tun

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(); 
} 

Vergessen Sie nicht zu schließen die Referenzen, so dass Sie keinen Speicher verlieren. Sie finden weitere Informationen here.

0

Ich denke, es kann Ihnen helfen.

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

Vielleicht ist es keine schöne Lösung, aber funktioniert gut für mich.