Анимация нескольких изображений с помощью Java

У меня есть вопрос об анимации снимков экрана Java. Мое приложение использует функцию robot() и цикл для создания нескольких снимков экрана и сохранения их с именами в последовательном порядке, от 1 до номера цикла.

Дело в том, что мне нужно поместить эти изображения в «фильм», хотя формат не имеет большого значения. К сожалению, я понятия не имею, как это сделать, и я сижу на своем iPad, когда путешествую.

РЕДАКТИРОВАТЬ: Я имею в виду, что мне нужно что-то, что может создать фильм или анимацию из моего Java-приложения с этими скриншотами.


person DRH1469    schedule 28.10.2013    source источник
comment
ваш вопрос в основном заключается в том, как создать что-то вроде gif, используя серию изображений в качестве кадров, верно?? кстати, у тебя есть i-pad, приветствую тебя :) :)   -  person Hussain Akhtar Wahid 'Ghouri'    schedule 28.10.2013


Ответы (3)


Вы можете создать анимированный GIF без сторонней библиотеки следующим образом:

void writeAnimatedGif(OutputStream stream,
                      Iterable<BufferedImage> frames,
                      int delayInMilliseconds,
                      Integer repeatCount)
throws IOException {
    try (ImageOutputStream iioStream =
            ImageIO.createImageOutputStream(stream)) {

        ImageWriter writer =
            ImageIO.getImageWritersByMIMEType("image/gif").next();
        writer.setOutput(iioStream);

        writer.prepareWriteSequence(null);

        for (BufferedImage frame : frames) {
            writeFrame(frame, delayInMilliseconds, writer, repeatCount);
            repeatCount = null;
        }

        writer.endWriteSequence();
        writer.dispose();
    }
}

void writeFrame(BufferedImage image,
                int delayInMilliseconds,
                ImageWriter writer,
                Integer repeatCount)
throws IOException {
    ImageTypeSpecifier type =
        ImageTypeSpecifier.createFromRenderedImage(image);
    IIOMetadata metadata = writer.getDefaultImageMetadata(type, null);
    String format = metadata.getNativeMetadataFormatName();

    Node tree = metadata.getAsTree(format);

    if (repeatCount != null)
    {
        setRepeatCount(repeatCount, tree);
    }

    setDelayTime(delayInMilliseconds, tree);

    metadata.setFromTree(format, tree);

    writer.writeToSequence(new IIOImage(image, null, metadata), null);
}

private void setRepeatCount(Number repeatCount, Node imageMetadata)
{
    Element root = (Element) imageMetadata;

    ByteBuffer buf = ByteBuffer.allocate(3).order(ByteOrder.LITTLE_ENDIAN);
    buf.put((byte) 1);  // sub-block index (always 1)
    byte[] appExtBytes = buf.putShort(repeatCount.shortValue()).array();

    Element appExtContainer;
    NodeList nodes = root.getElementsByTagName("ApplicationExtensions");
    if (nodes.getLength() > 0) {
        appExtContainer = (Element) nodes.item(0);
    } else {
        appExtContainer = new IIOMetadataNode("ApplicationExtensions");

        Node reference = null;
        nodes = root.getElementsByTagName("CommentExtensions");
        if (nodes.getLength() > 0) {
            reference = nodes.item(0);
        }

        root.insertBefore(appExtContainer, reference);
    }

    IIOMetadataNode appExt =
        new IIOMetadataNode("ApplicationExtension");
    appExt.setAttribute("applicationID", "NETSCAPE");
    appExt.setAttribute("authenticationCode", "2.0");
    appExt.setUserObject(appExtBytes);

    appExtContainer.appendChild(appExt);
}


private void setDelayTime(int delayInMilliseconds, Node imageMetadata)
{
    Element root = (Element) imageMetadata;

    Element gce;
    NodeList nodes = root.getElementsByTagName("GraphicControlExtension");
    if (nodes.getLength() > 0) {
        gce = (Element) nodes.item(0);
    } else {
        gce = new IIOMetadataNode("GraphicControlExtension");

        Node reference = null;
        nodes = root.getElementsByTagName("PlainTextExtension");
        if (nodes.getLength() > 0) {
            reference = nodes.item(0);
        }
        if (reference == null) {
            nodes = root.getElementsByTagName("ApplicationExtensions");
            if (nodes.getLength() > 0) {
                reference = nodes.item(0);
            }
        }
        if (reference == null) {
            nodes = root.getElementsByTagName("CommentExtensions");
            if (nodes.getLength() > 0) {
                reference = nodes.item(0);
            }
        }

        root.insertBefore(gce, reference);
    }

    gce.setAttribute("delayTime",
        String.valueOf(delayInMilliseconds / 10));
}

См. также http://docs.oracle.com/javase/7/docs/api/javax/imageio/metadata/doc-files/gif_metadata.html#gif_image_metadata_format .

person VGR    schedule 28.10.2013

(Устаревшая, заброшенная) Java Media Framework может превратить JPEG в MOV. Хотя обратите внимание, что они имеют ужасное сжатие (с использованием конкретного реализованного кодека сжатия) и приводят к огромным размерам файлов. Пример можно увидеть в этом ответе.

person Andrew Thompson    schedule 28.10.2013

Вы можете использовать любой генератор GIF для создания фильма из изображений. Вам нужно сделать это на вашем ipad? возможно, используйте это приложение

Или используйте веб-сайт, например этот.

Но какое конкретно это имеет отношение к Java?

РЕДАКТИРОВАТЬ: как указано в комментарии, класс Java для создания GIF из изображений приведен в этом сообщении

person Mailerdaimon    schedule 28.10.2013
comment
Я хотел интегрировать его в свою программу на Java, поэтому после того, как была сделана серия снимков экрана, это было сделано автоматически. - person DRH1469; 28.10.2013
comment
ааа, хорошо .. тогда посмотрите этот вопрос, где был дан хороший ответ: ссылка EDIT: изменена ссылка на правильный ответ - person Mailerdaimon; 28.10.2013