Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Animer une image GIF.... animée

8 réponses
Avatar
Steph
Salut a tous,

J'essaie d'afficher les différentes frames d'une GIF animée. Mais cette GIF
animée n'est pas repetitive, c'est a dire qu'elle s'anime une fois et
s'arrete (c'est a dire qu'elle ne boucle pas a l'infini).
J'arrive a animer qu'une fois cette image mais je n'arrive pas, a une autre
moment de mon appli, l'animer une nouvelle fois.
Avez-vous une solution ? En fait, il faudrait qu'au second affichage,
l'image reparte sur la première frame de l'animation. En fait, elle reste
sur la dernière j'ai l'impression.

Merci d'avance

Steph

8 réponses

Avatar
Cedric
"Steph" wrote
Salut a tous,
J'essaie d'afficher les différentes frames d'une GIF animée. Mais cette
GIF

animée n'est pas repetitive, c'est a dire qu'elle s'anime une fois et
<...>


Et si tu fais un Thread qui boucle a l'infini. Dans le run(), tu fais fais
appel a la methode setImage(gifAnime) ( ou setIcon, setxxx, ...), suivi d'un
sleep() de la duree d'un cycle d'animation. Tu risques d'avoir des
clignotement, mais ca bouclera a l'infini.

Ced

Avatar
MacTotoche
Cedric wrote:
Et si tu fais un Thread qui boucle a l'infini. Dans le run(), tu fais fais
appel a la methode setImage(gifAnime) ( ou setIcon, setxxx, ...), suivi d'un
sleep() de la duree d'un cycle d'animation.
Hello,

moyennement d'accord là-dessus : c'est pas facile de prévoir quelle
sera la durée d'un cycle. En tout ças je n'ai pas trouvé de moyen. Je
proposerais plutôt de vérifier le fichier gif et de comparer avec
d'autres gifs animés.

Tu risques d'avoir des
clignotement, mais ca bouclera a l'infini.


--
Olivier
This space for sale.

Avatar
Steph
Voici un lien sur l'image en question :
http://us.f1.yahoofs.com/users/efded5dc/bc/Mes+documents/boule_jaune.gif?bca
iRD_AgyAeaXxu
J'utilise le JDK 1.3.1

Les GIF animés qui bouclent s'animent a l'infini.
Ceux qui ne bouclent qu'une fois ne s'anime qu'une fois, impossible ensuite
de ls relancer.

Merci de ton aide.
Steph


"MacTotoche" a écrit dans le message de news:
3f0cf656$0$26618$
Steph wrote:
Salut a tous,

J'essaie d'afficher les différentes frames d'une GIF animée. Mais cette
GIF


animée n'est pas repetitive, c'est a dire qu'elle s'anime une fois
Hello,

j'ai fait quelques essais chez moi avec des gifs animés, certains
définis pour boucler d'autres non et j'observe l'efffet opposé : tous
bouclent indéfiniment, et à vitesse maxi indépendemment de celle
définie pour les frames dans le fichier gif.

Pourrais-tu préciser ta version de java, ta plateforme et surtout
donner un lien sur l'image qui pose probleme ?

As-tu essayé avec d'autres gifs animés, bouclant ou non ?

A priori, je serais tenté d'essayer d'abord de voir si définir la
séquence comme bouclant ne marcherait pas, plutôt qu'essayer de coder
une solution par programme (Graphic Converter sous Mac fait ça très
bien, sous win je sais pas).

Voilà le bout de code que j'ai utilisé pour tester.

import java.awt.*;
import java.awt.event.*;

class Anim extends Canvas {

public static void main(String[] args) {
//System.setProperty("apple.awt.brushMetalLook", "true");
Frame f = new Frame("");

Anim anim = new Anim();

f.add("Center", anim);
f.setSize(200, 200);
f.setVisible(true);

anim.init();
anim.start();
}

Image image;

public Anim() {
image=Toolkit.getDefaultToolkit().getImage("arrow86-1.gif");}

public void init() { resize(180,180);}

public void start() { }

public void paint(Graphics g) { g.drawImage(image,0,0,Color.white,this);}

public Dimension preferredSize() { return (new Dimension(180,180));}

public synchronized Dimension minimumSize() { return (new
Dimension(180,180));}
}


--
Olivier
This space for sale.




Avatar
Steph
Oups, le lien st mauvais.
Le voici : http://membres.lycos.fr/fiupsoalumni/boule_jaune.gif

"Steph" a écrit dans le message de news:
bej4e8$qb7$
Voici un lien sur l'image en question :

http://us.f1.yahoofs.com/users/efded5dc/bc/Mes+documents/boule_jaune.gif?bca

iRD_AgyAeaXxu
J'utilise le JDK 1.3.1

Les GIF animés qui bouclent s'animent a l'infini.
Ceux qui ne bouclent qu'une fois ne s'anime qu'une fois, impossible
ensuite

de ls relancer.

Merci de ton aide.
Steph


"MacTotoche" a écrit dans le message de
news:

3f0cf656$0$26618$
Steph wrote:
Salut a tous,

J'essaie d'afficher les différentes frames d'une GIF animée. Mais
cette



GIF
animée n'est pas repetitive, c'est a dire qu'elle s'anime une fois
Hello,

j'ai fait quelques essais chez moi avec des gifs animés, certains
définis pour boucler d'autres non et j'observe l'efffet opposé : tous
bouclent indéfiniment, et à vitesse maxi indépendemment de celle
définie pour les frames dans le fichier gif.

Pourrais-tu préciser ta version de java, ta plateforme et surtout
donner un lien sur l'image qui pose probleme ?

As-tu essayé avec d'autres gifs animés, bouclant ou non ?

A priori, je serais tenté d'essayer d'abord de voir si définir la
séquence comme bouclant ne marcherait pas, plutôt qu'essayer de coder
une solution par programme (Graphic Converter sous Mac fait ça très
bien, sous win je sais pas).

Voilà le bout de code que j'ai utilisé pour tester.

import java.awt.*;
import java.awt.event.*;

class Anim extends Canvas {

public static void main(String[] args) {
//System.setProperty("apple.awt.brushMetalLook", "true");
Frame f = new Frame("");

Anim anim = new Anim();

f.add("Center", anim);
f.setSize(200, 200);
f.setVisible(true);

anim.init();
anim.start();
}

Image image;

public Anim() {
image=Toolkit.getDefaultToolkit().getImage("arrow86-1.gif");}

public void init() { resize(180,180);}

public void start() { }

public void paint(Graphics g) {
g.drawImage(image,0,0,Color.white,this);}



public Dimension preferredSize() { return (new Dimension(180,180));}

public synchronized Dimension minimumSize() { return (new
Dimension(180,180));}
}


--
Olivier
This space for sale.








Avatar
MacTotoche
Steph wrote:
Ca y est!!!
J'ai trouvé, en fait c'est tout con....
Il suffit d'appeler la méthode Image.flush, et ca recharge l'image, donc
l'animation repart du debut.
Ah oui, bien... je n'y avais pas pensé :-(


Je n'étais pas convaicu par l'idée de Cedric mais en fait elle était
bonne si on dispose d'un moyen de savoir quand un cycle d'animation
est fini, et alors on fait repartir l'animation par ta méthode.

Comme l'animation est gérée par un thread, on peut aller chercher si
le Thread d'animation est fini et alors on fait ton flush().

Alors, il faut un Thread de plus qui teste périodiquement si
l'animation est en cours.

Au total ça pourrait donner un truc comme ça :

import java.awt.*;
import javax.swing.*;
import java.awt.event.*;

class Anim2 extends JComponent {

public static void main(String[] args) {
//System.setProperty("apple.awt.brushMetalLook", "true");
JFrame f = new JFrame("");

Anim2 anim = new Anim2();
anim.init();
anim.start();

f.getContentPane().add(anim);
f.pack();
f.setVisible(true);

}

Image image;

public Anim2() {
image=Toolkit.getDefaultToolkit().getImage("boule_jaune.gif");

}

public void init() {
setSize(180,180);
setPreferredSize(new Dimension(180,180));

addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent ev) {
System.out.println("clicked");
image.flush();
repaint();

}
});

Thread obs = new Thread() {
public void run() {
while (true) {
if (!(ThreadList.animating())) {
image.flush();
repaint();
}
try {Thread.sleep(50);} catch (InterruptedException ex) {}
}
}
};
obs.start();

}

public void start() { }

boolean list = false;

public void paintComponent(Graphics g) {
g.drawImage(image,0,0,Color.white,this);

// pour essai seulement
if (list) {
ThreadList.listThreads();
list = false;
}

System.out.println(ThreadList.animating());
}

}

// tiré d'un code posté sur usenet
//
http://groups.google.fr/groups?hl=fr&lr=&ie=UTF-8&selm7c5e50d.43209686%40news.giganews.com&rnum=4
// par
// Paul Hyde ( pnh AT programix-inc DOT com )
// author of "Java Thread Programming"
// http://www.programix.com/threadbook/

class ThreadList extends Object {
public static void listThreads() {
ThreadGroup group = Thread.currentThread().getThreadGroup();

ThreadGroup rootGroup = null;

// remonter l'arbre des groupes
while ( group != null ) {
rootGroup = group;
group = group.getParent();
}

// surdimensionner le tableau par precaution
int sizeEstimate = rootGroup.activeCount() * 2;
Thread[] threadList = new Thread[sizeEstimate];

int size = rootGroup.enumerate(threadList);

for ( int i = 0; i < size; i++ ) {
System.out.println(
"#" + i +
", '" + threadList[i].getName() +
"', priority=" +
threadList[i].getPriority() +
", groupName=" +
threadList[i].getThreadGroup().getName());
}
}

public static boolean animating() {
ThreadGroup group = Thread.currentThread().getThreadGroup();

ThreadGroup rootGroup = null;

// remonter l'arbre des groupes
while ( group != null ) {
rootGroup = group;
group = group.getParent();
}

// surdimensionner le tableau par precaution
int sizeEstimate = rootGroup.activeCount() * 2;
Thread[] threadList = new Thread[sizeEstimate];

int size = rootGroup.enumerate(threadList);

for ( int i = 0; i < size; i++ ) {
if (threadList[i].getName().regionMatches(0, "Image Animator", 0, 14))
return true;
}
return false;
}

}


--
Olivier
This space for sale.

Avatar
MacTotoche
Cedric wrote:
Et si tu fais un Thread qui boucle a l'infini.
En fait une idée dérivée de la tienne, à laquelle j'avais tort de ne

pas croire, semble bonne.
Sorry.

--
Olivier
This space for sale.

Avatar
Cedric
"MacTotoche" wrote in message
Comme l'animation est gérée par un thread, on peut aller chercher si
le Thread d'animation est fini et alors on fait ton flush().

Alors, il faut un Thread de plus qui teste périodiquement si
l'animation est en cours.


Vi :) J'avais pas pousse plus mon idee. Merci de l'avoir illustree. En fait
ca fait un code assez complique pour un simple gif Anime. Utiliser un outil
graphique pour extraire les frames et faire un tableau d'Image serait plus
simple non ? :)

Cedric

Avatar
Steph
Oui, mais en fait, je ne cherche pas a relancer l'anim juste aprés qu'elle
soit finie, mais a un autre moment dans mon appli, sur un evenement donné.
Et dans ce cas, le Image.flush suffit a reinitialiser l'image, et donc a
pouvoir reafficher l'animation.
En tout cas, merci de vous etre penchés sur le pb...
On aura au moins appris qq chose...

"MacTotoche" a écrit dans le message de news:
3f0e6715$0$5423$
Cedric wrote:
Utiliser un outil
graphique pour extraire les frames et faire un tableau d'Image serait
plus


simple non ? :)
C'est pour ça qu'au début j'avais proposé d'éditer plutôt le fichier

image pour définir la séquence comme boucle infinie, avec un outil
comme GraphicConverter sous Mac.

--
Olivier
This space for sale.