2016-08-03 2 views
2

Я пытаюсь получить растровое изображение из SimpleDraweeView.Получение bitmapdrawable из fresco

Я уже выставиться мой SimpleDraweeView с Ури изображением:

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

И теперь я пытаюсь сохранить изображение в памяти (для хранения) телефона.

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

Но если я использую выше код я получаю: com.facebook.drawee.generic.RootDrawable не может быть приведен к android.graphics.drawable.BitmapDrawable

преобразовать profileImage.getDrawable в растровое изображение как это: empty image

Я пытаюсь получить растровое изображение, которое в настоящее время отображается в SimpleDraweeView

+0

Почему именно вы хотите это сделать? Фреско уже управляет всем кэшированием и т. Д. Для вас. –

+0

@AlexanderOprisnik Хорошая причина, по которой я могу придумать для тестирования пользовательского интерфейса, полезно иметь доступ к растровому рисунку, но для этого нам нужно начать с обычного рисования, похоже, и я не знаю, как это сделать –

+0

Поскольку я хочу, чтобы пользователь увидел некоторое изображение, а затем сохранил его на хранение –

ответ

0

Получение растровых изображений вытяжка не является хорошей идея, так как лежащая в основе реализация Фреско может измениться в грядущих событиях re, что нарушит ваш код.

Я думаю, вы действительно хотите получить необработанные кодированные изображения (так что вам не нужно повторно кодировать изображение). Вы можете получить закодированные байты изображения с

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

Поскольку вы уже принес изображение раньше, он должен быть доступен мгновенно, и вы можете сделать что-то вроде

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

Не забудьте закрыть ссылки, чтобы вы не просачивали память. Вы можете найти дополнительную информацию here.

0

Я думаю, что это может вам помочь.

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

Возможно, это не красивое решение, но хорошо работает для меня.

Смежные вопросы