преобразовать массив байтов в gif на java / Android

#java #android #gif #animated-gif

#java #Android #gif #анимированный-gif

Вопрос:

В моем приложении для Android я получаю массив байтов с сервера и должен преобразовать их в изображение .gif, а затем поместить его в представление. Я уже знаю, как преобразовать их в неподвижное изображение с помощью BitmapFactory, но изображения всегда получаются неподвижными. Я использую gif-drawable в качестве своего вида контейнера для изображения .gif. Я протестировал его с локальным анимированным GIF, и он отлично работает. Как я могу поместить массив байтов в формат, доступный для рисования в формате gif?

в макете у меня есть это:

 <pl.droidsonroids.gif.GifImageView
            android:id="@ id/imgExerciseImage"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:adjustViewBounds="true"
            android:contentDescription="exercise image" />
  

это представление, похожее на ImageView, которое может отображать анимированные GIF-файлы

Я хочу отобразить в нем изображение, которое я получаю с моего сервера firebase. это код:

 imageRef.getBytes(DatabaseConstants.ONE_MEGABYTE * 3).addOnSuccessListener(new OnSuccessListener<byte[]>() {
            @Override
            public void onSuccess(byte[] bytes) {
                Bitmap bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);
                imgExerciseImage.setImageBitmap(bitmap);
                progressDialog.dismiss();
            }
        }
  

байт[] — это анимированный GIF-файл. но для того, чтобы представить это в моем представлении, я должен использовать byte[] для формирования изображения. в этом примере я использую BitmapFactory для создания растрового изображения. как я могу создать gif вместо растрового изображения?

Комментарии:

1. Почему бы не преобразовать входной поток в изображение? Для этого есть обширная поддержка. Нет необходимости самостоятельно переводить все в массив байтов.

2. Потому что я использую firebase и не могу получить ничего, кроме массива байтов

3. Что де вы имеете в виду под этим? Вы получите поток байтов. Это не массив байтов. Вам решать, что вы будете делать с байтами. Если вы поместите их в массив, да, тогда у вас будет массив байтов.

4. Далее неясно, что будут представлять байты. Что они содержат, если вам нужно преобразовать их в gif? А jpg? А png? А bmp? Разве это уже не GIF-изображение?

5. Чтобы использовать firebase, вы используете функцию для считывания информации с сервера, а затем получаете данные в обратном вызове, который имеет параметр массива байтов. У меня нет никакого взаимодействия с inputstream

Ответ №1:

похоже, что gif-drawable поставляется с объектом GifDrawable, который может получать массив байтов в своем конструкторе для создания анимированного gif, который затем можно поместить в GifImageView

 try {
    GifDrawable gif = new GifDrawable(bytes);
    imgExerciseImage.setImageDrawable(gif);
} catch (IOException e) {
    e.printStackTrace();
}