Как получить длину (во времени) из анимированного GIF - PullRequest
5 голосов
/ 02 декабря 2011

Есть ли способ узнать, сколько времени займет однопетлевой анимированный GIF-файл?

Ответы [ 2 ]

2 голосов
/ 02 декабря 2011

Что ж, специфика зависит от того, какой интерфейс вы используете для управления этими анимированными GIF-файлами (я не знаю, как это выглядит в родной Java / AWT / Swing), однако основная идея будет рассчитываться (фрейм скорость * количество кадров).

Если вы кодируете инструмент манипуляции GIF вручную, я рекомендую взглянуть на http://www.onicos.com/staff/iz/formats/gif.html

Надеюсь, это поможет хоть немного.

Обновление: попробуйте реализовать интерфейс ImageObserver. Посмотрите на флаг ImageObserver.FRAMEBITS в этом классе, чтобы обнаружить обновления кадров. http://docs.oracle.com/javase/6/docs/api/java/awt/image/ImageObserver.html

Это все еще оставляет вопрос о том, сколько кадров имеет GIF. Вы можете попробовать взглянуть на функцию Image.getProperty (). У меня возникли некоторые трудности с поиском документации, касающейся наличия свойства frame, но посмотрите.

1 голос
/ 12 марта 2017

Используйте библиотеку Metadata-Extractor , чтобы прочитать метаданные файлов изображений.Приведенный ниже фрагмент кода можно использовать для чтения GifControlDirectory для каждого изображения (кадра) в файле GIF.

/**
 * Get time length of GIF file in milliseconds.
 *
 * @return time length of gif in ms.
 */
public int getGifAnimatedTimeLength(String imagePath) {
    Metadata metadata = ImageMetadataReader.readMetadata(imagePath);
    List<GifControlDirectory> gifControlDirectories =
            (List<GifControlDirectory>) metadata.getDirectoriesOfType(GifControlDirectory.class);

    int timeLength = 0;
    if (gifControlDirectories.size() == 1) { // Do not read delay of static GIF files with single frame.
    } else if (gifControlDirectories.size() >= 1) {
        for (GifControlDirectory gifControlDirectory : gifControlDirectories) {
            try {
                if (gifControlDirectory.hasTagName(GifControlDirectory.TAG_DELAY)) {
                    timeLength += gifControlDirectory.getInt(GifControlDirectory.TAG_DELAY);
                }
            } catch (MetadataException e) {
                e.printStackTrace();
            }
        }
        // Unit of time is 10 milliseconds in GIF.
        timeLength *= 10;
    }
    return timeLength;
}

Обратите внимание, что даже если файл GIF имеет несколько кадров, вполне возможно, что каждый кадр может иметь задержку0 или нет метаданных TAG_DELAY.Кроме того, эта статья подробно описывает еще одну проблему того, как различные платформы используют значение задержки.

...