Учитывая список полноцветных полноразмерных кадров в BufferedImage
и список длительностей кадров, как я могу создать изображение без потерь, что при надевании JLabel будет анимироваться?Как создать анимированное изображение из неподвижных кадров?
Из того, что я могу find, я мог бы создать ImageWriter
Обертывание ByteArrayOutputStream
, написать IIOImage
кадры к нему, а затем Toolkit.getDefaultToolkit().createImage
поток в ToolkitImage
.
Есть две проблемы с этой попыткой.
- ImageWriter может быть обработан только с одним из известных датчиков изображения, и не существует ни для формата анимированных изображений без потерь истинного цвета (например, MNG),
- Он кодирует (сжимает) изображение, а затем распаковывает это снова становится ненужной угрозой для работы.
[Edit]
Некоторые более краткие ограничения и требования. Пожалуйста, не придумывайте ничего, что сгибает эти правила.
Что я не Требуется:
- Создание нить анимации и живописи/обновления каждого кадра анимации сам,
- Использование любого рода 3-сторонней библиотеки,
- Заимствование любой внешний процесс, например, веб-браузер,
- Показать его в виде видеопроигрывателя или сцены с 3D-ускорением (OpenGL/etc),
- Работайте напрямую LY с классами из
sun.*
пакетов
Что сделать хотите:
- Размер кадра может быть столь же большим, как размер монитора. Пожалуйста, не беспокойтесь о производительности. Я буду беспокоиться об этом. Вы просто будете беспокоиться о правильности.
- Рамы все имеют одинаковый размер,
- a
Image
подкласс. Я должен был бы нарисовать изображение какg.drawImage(ani, 0, 0, this)
, и он будет анимировать или обернуть его вImageIcon
и отобразить его на JLabel/JButton/etc, и он будет анимировать, - Каждый кадр может иметь различную задержку от 10 мс до секунды,
- Анимация может цикл или может закончиться, и это определяется один раз в анимации (так же, как GIF),
- я могу использовать что-нибудь упакованного с Oracle Java 8 (например, JavaFX),
- Что бы ни случилось , он должен интегрироваться с SWING
Дополнительно:
- Рамки могут иметь прозрачность.Если необходимо, я могу заранее опасаться изображениям, так как анимация будет показана на известном фоне (один цвет).
- Мне все равно, должен ли я сам подкласс
Image
и добавить туда анимационную нить, которая будет сотрудничать сImageObserver
или написать свой собственныйInputStreamImageSource
, но я не знаю как. - Если я могу каким-то образом показать сцену JavaFX с некоторым кодом HTML и CSS, который оживляет мои изображения, то это тоже хорошо. НО до тех пор, пока все они инкапсулированы в один SWING-совместимый объект, который я могу пройти.
Я бы не использовал JLabel. Я бы рисовал изображения непосредственно на JPanel, используя метод paintComponent. Насколько велики ваши образы? –
Размер изображения может быть любым: от значка до разрешения монитора (не больше). На самом деле я не требую JLabel (мне придется переписать одно из моих приложений, которое в настоящее время использует JLabel). Но в основном я попросил JLabel совместимость как простой способ означать: один '(Toolkit) Image', который содержит все кадры , –
С изображениями разных размеров анимация более яркая. Как долго вы хотите, чтобы каждое изображение отображалось? –