Classe com.sun.imageio.plugins.gif.GIFImageWriter - Imagens na sequencia

4 respostas
E

Olá.

Estou com o seguinte problema, estou usando a classe ImageReader em conjunto com ImageWriter para fazer o redimensionamento de imagens, e uns tratamentos extras, entretanto, quando tento gravar um gif animado, tento usar o método canInsertImage do GIFImageWriter ele sempre me retorna false. Acredito que esteja faltando alguma configuração.

Segue a parte importante do código:

ImageWriter writer = writers.next();
            ImageOutputStream ios = new FileImageOutputStream(thumb);
            writer.setOutput(ios);

            BufferedImage thumbImage = new BufferedImage(width, height,
                            BufferedImage.TYPE_INT_ARGB);

            Graphics2D graphics2D = thumbImage.createGraphics();

            graphics2D.drawImage(reader.read(cont), 0, 0, width, height, null);
            graphics2D.dispose();
            
            writer.write(thumbImage);
            
            
            for(cont = 1;cont<contImages&&writer.canInsertImage(cont);cont++){
                graphics2D.drawImage(reader.read(cont), 0, 0, width, height, null);
                graphics2D.dispose();
                IIOImage thumbImage_IIOImage = new IIOImage(thumbImage, null, null);
                writer.writeInsert(-1, thumbImage_IIOImage, null);
                
            }

O código está bem resumido, mas a parte que poderia estar causando erro provavelmente está aí.

Se alguém tiver alguma ideia do que está faltando para habilitar a gravação de outras imagens como frames desse gif eu agradeço.

4 Respostas

E

usando o writeToSequence deu certo. Obrigado.

Agora, se alguém souber porque não deu certo com o outro método eu agradeceria.

E também tenho uma dúvida, como faço para habilitar o loop da animação no gif animado; assim, para ele ficar repetindo a animação repetidamente.

E

outra coisa que estou achando estranho, o método getTileGridXOffset retorna sempre 0. Mesmo quando o frame não está posicionado Top/Left…

Alguém sabe o que pode estar acontecendo?

E

bom, no caso do gif, teve que ficar assim (não encontrei outro jeito)

int top = 0; int left = 0; IIOMetadata metadata = reader.getImageMetadata(cont); if(metadata instanceof GIFImageMetadata){ left = ((GIFImageMetadata)reader.getImageMetadata(cont)).imageLeftPosition; top = ((GIFImageMetadata)reader.getImageMetadata(cont)).imageTopPosition; }else{ top = reader.getTileGridYOffset(cont); left = reader.getTileGridXOffset(cont); }

Agora falta encontrar como fazer o gif animado dar loop na animação

E

Bom, para resolver o problema do loop, inseri o header que indica o loop diretamente através do ImageOutputStream, segue o código para quem precisar:

if(extension.equalsIgnoreCase("gif")){
            ios.write(33); // extension introducer
            ios.write(255); // extension type

            ios.write(11); // first block length
            ios.write("NETSCAPE".getBytes());
            ios.write("2.0".getBytes());

            ios.write(3); // second block length
            ios.write(1); // kennung loop block
            ios.write(0);
            ios.write(0);

            ios.write(0); // block terminator

            return true;
        }else{
            return false;
        }
Edit: insiro esses bytes no arquivo diretamente depois da primeira imagem.
Criado 24 de março de 2012
Ultima resposta 25 de mar. de 2012
Respostas 4
Participantes 1