Получение растрового изображения с фрески

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

Я уже установил свой SimpleDraweeView с изображением URI:

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 в растровое изображение, изображение выглядит так: пустое изображение

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

2 ответа

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

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

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

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

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

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

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

Другие вопросы по тегам