Java gif frame для BufferedImage, не удерживая все их как массив

99
9

Поэтому я несколько раз пробовал, и я просто не могу заставить его работать. У меня есть программа, которая преобразует анимированные GIF в последовательность PNG с набором настраиваемых параметров.

Проблема в том, что я смог найти только способ чтения кадров GIF в качестве BufferedImages и повторного использования ImageReader, связанного с созданием массива или списка типов, в котором хранятся все фреймы. Это очень удобно, но для длинных файлов с высоким разрешением это сильно поглощает баран. В идеале я бы хотел прочитать их по одному и избавиться от них, когда я закончил с рамкой. Я попытался изучить, как работают сжатые GIF файлы, но способ удаления отходов оказывается немного над моей головой. Два основных метода, которые я пробовал и неудачно пропустил для кода, - это

public BufferedImage getNextFrame() 

для возврата несжатого, полного следующего кадра и

public void reset()

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

Может ли кто-нибудь дать мне несколько указаний о том, как эффективно управлять GIF-ресурсами, когда я намерен делать больше с кадрами, чем просто отображать их? Я не прошу вас написать все, но просто дайте мне представление о том, как это можно сделать.

спросил(а) 2021-01-28T00:15:12+03:00 4 месяца, 3 недели назад
1
Решение
99

Если вы не возражаете против использования стороннего кода, вот библиотека изображений Java, которую я создал, которая могла бы сделать гораздо больше, чем просто захватить каждый кадр анимированного GIF.

Тем не менее, существует определенный класс FrameReader который предназначен для того, чтобы делать именно то, что вам нужно: захватить GIF-фреймы по одному. В следующем примере показано, как его использовать:

import java.awt.image.BufferedImage;
import java.io.FileInputStream;
import java.io.InputStream;

import com.icafe4j.image.gif.FrameReader;
import com.icafe4j.image.gif.GIFFrame;

public class GrabFrame {

public static void main(String[] args) throws Exception {
InputStream is = new FileInputStream(args[0]);
FrameReader reader = new FrameReader();
BufferedImage curFrame = null;

GIFFrame gifFrame = reader.getGIFFrameEx(is);

while(gifFrame != null) {
curFrame = gifFrame.getFrame();
// Do something with curFrame
gifFrame = reader.getGIFFrameEx(is);
}
}
}

метод getGIFFrameEx(is) возвращает экземпляр GIFFrame, который обертывает среди других параметров управления кадрами BufferedImage, который учитывает различные методы удаления, используемые анимированным графическим блоком управления GIF. Если вам не getGIFFrame(is) методы удаления, вы можете вызвать getGIFFrame(is) который также обертывает BufferedImage, который, однако, не учитывает отношения между разными кадрами. Это может создать странно выглядящие рамки, о которых здесь говорят.

ответил(а) 2021-01-28T00:15:12+03:00 4 месяца, 3 недели назад
45

Я не мог понять это сам, но я нашел это, чтобы сделать трюк. Глядя на код, я даже не был близок к тому, чтобы понять это сам.

ответил(а) 2021-01-28T00:15:12+03:00 4 месяца, 3 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема