PDA

Voir la version complète : Testé l'affichage d'une image


slade
29/08/2007, 09h44
Bonjour j'essaye de recreer un flux video a partir d'une serie d'image, seulement les images sont remplacé au fur et a mesure que je les charge, donc des fois aucune image ne se charge, j'aurais besoin de savoir si une image est chargé , et si elle ne l'ait pas qu'elle charge l'ancienne.
Merci.
Voici le code pour l'instant :

import java.awt.* ;
public class defaut extends java.applet.Applet{
Image im;
String d ;
int a = 200782810 ;
int b = 2631294 ;
int o = 0 ;
int c = 4320 ;
long tempsactuel = 10000 ;
long tempsancien = 10 ;
public void init() {
}
public void actua(String chaine)
{
this.d = chaine ;
repaint() ;
}
public void paint (Graphics g)
{
if (c> 4330)
{
c = 4320 ;
}
this.im = getImage(getCodeBase() , d) ;
if(tempsactuel >= (tempsancien + 1000))
{
d = "http://192.168.1.62/IMAGE.JPG?cidx=" ;
d += String.valueOf(a);
d += String.valueOf(b) ;
d += String.valueOf(o) ;
d += String.valueOf(c) ;
System.out.println(d) ;
tempsancien = tempsactuel;
tempsactuel = 0 ;
}
else
{
tempsactuel = System.currentTimeMillis();
}
prepareImage(this.im,this) ;
g.drawImage(this.im,0,0, this ) ;
update(g) ;
}

}

Mokona
29/08/2007, 10h55
On a un peu cherché à comprendre ta question sur Irc et...

[...]un flux video a partir d'une serie d'image, seulement les images sont remplacé au fur et a mesure que je les charge[...]

Cela me semble exactement le but recherché. Pourquoi "seulement" ?

donc des fois aucune image ne se charge

Je ne comprends pas le "donc". Tu dis que les images sont remplacées parce qu'elles se chargent, ce qui implique qu'elles ne se chargent parfois pas.

j'aurais besoin de savoir si une image est chargé , et si elle ne l'ait pas qu'elle charge l'ancienne.

Et si une image ne se charge pas (on ne sait pas pourqoi), tu lances le re-chargement de l'ancienne image ? Ca ne va pas êtres très fluide...

Donc, si tu pouvais reformuler ta question...

(et si quelqu'un a compris et peut aider, tant mieux :) )

SëB
29/08/2007, 12h08
De ce que j'ai compris, tu veux faire une sorte de film à partir d'une série d'image...

Tu charges ton image, tu charges l'image suivante, etc... Ensuite, tu voudrais que si une image ne se charge pas correctement, tu puisses le savoir pour recharger l'image précédente...

Woila ce que j'ai compris :-) En fait, il faudrait un indicateur d'état du chargement...

Je ne suis pas complètement sur de mon coup, mais est ce qu'en mettant un truc du genre:
If (System.out.println(d))
{
tempsancien = tempsactuel;
tempsactuel = 0 ;
}
Else
{
// Gestion d'erreur
}

Woila une petite idée :-)

SëB, le revenant par intermitence...

slade
29/08/2007, 15h08
Je vais tacher d'éclaircir la situation ^^
Merci de votre interêt déjà ^^

En fait une serie de camera ip , capture des images en JPG, puis une application java, en fait un flux vidéo, malheureusement cette applet est assez pauvre et j'ai besoin de plus de contrôle sur la vidéo, ce qui fait que je doit recoder, l'applet java.

Je doit donc récupérer les images présentes sur la camera et les faire afficher les unes a la suite des autres de manière fluide. Le problème c'est que la camera gère les images de facon extrement etrange.

Je m'explique:
le nom d'un image ressemble a cela :
200782812053129404320.jpg

Alors je me suis dit que 2007 c'étais surement l'année, 8 le mois, 28 le jour 12 l'heure 05 la minutes, et le reste une suite de chiffre incompréhensible.

Oui mais voila si je lui dit d'afficher :
200782612053129404320.jpg
donc 26 au lieu de 28, j'ai quand même la dernière image qui a été prise !
Et ce quelque soit le chiffre que je met comme nom d'image.
Donc je crée une boucle qui me charge les 10 images allant de ......4320.jpg a .....4330.jpg
afin d'avoir un flux vidéo, seulement un coup de temps en temps , une des images n'existe pas (la camera est surement en train de la remplacer) ce qui fait un affichage vraiment pas terrible, et des coupure blanches.
Donc j'aimerais pouvoir charger l'image d'avant (qui sera en fait celle d'après puisqu'il y a des chances qu'elle ait été remplacé) a la place du blanc.
Car oui, toutes les images se remplacent extremement vite par la dernière prise par la camera.

sëb le code que tu donne n'ira pas car en fait je doit testé si l'affichage de l'image a été réalise, le lien sera bon mais c'est au niveau de l'affichage qu'il y aura un probleme.
En espérant avoir été plus clair ;)


Edit : J'ai d'ailleur aussi un autre problème, qui est que l'applet trouve l'image, mais l'affichage reste blanc.... Ca arrive assez souvent.
Edit2 : je me tape aussi des dizaine de StackOverFlowError que je ne sais pas bien comment résoudre...

slade
29/08/2007, 15h32
Après intense réflexion test et touti quanti.
Je pense avoir trouver comme fonctionne la camera, le nom de l'image n'a aucune importance, il n'y a qu'une seul image, et n'importe quelle nom redirige sur celle-là. Je ne voit que ca....
J'ai essayer de taper
2135676589999999999000000000000000000000000000000000000000000000000000000000000000000000.jpg
dans firefox et il me trouve encore la dernière image.
et a chaque fois que je rafraichit la page l'image change, comment faire
donc pour faire cela sur mon applet ?
faire une sorte de rafraichissement afin de récupérer la nouvelle image ?
J'ai modifié le code :
import java.awt.* ;
public class defaut extends java.applet.Applet{
Image im;
String d ;
int a = 0 ;
long tempsactuel = 10000 ;
long tempsancien = 10 ;
public void init() {
}
public void paint (Graphics g)
{
if (a> 4340)
{
a = 4330 ;
}
this.im = getImage(getCodeBase() , d) ;
if(tempsactuel >= (tempsancien + 1000))
{
d = "http://192.168.1.62/IMAGE.JPG" ;
System.out.println(d) ;
tempsancien = tempsactuel;
tempsactuel = 0 ;
a++;
}
else
{
tempsactuel = System.currentTimeMillis();
}
prepareImage(this.im,this) ;
g.drawImage(this.im,0,0, this ) ;
try
{
update(g) ;
}
catch (StackOverflowError e){}
repaint() ;
}

}
En fait l'url : "http://192.168.1.62/IMAGE.JPG" suffit très bien a récupérer la dernière image qui s'affiche et je n'ai quasiment plus de blanc, le problème maintenant c'est que l'image
ne s'actualise pas, elle reste figé, mais quand je relance l'applet j'ai une image différente...
Si quelqu'un a une piste.

deathangel
29/08/2007, 16h33
tu n'as pas le droit d'appeler un repaint dans le paint, ca ne sert à rien. L'image n'est recopiée à l'écran que lorsque ta fonction paint se termine. Donc ton image n'est jamais rafraichie. Il faut que tu fasses un thread séparé qui appellera ton repaint à ce moment là et à intervalles réguliers.

slade
29/08/2007, 16h37
J'ai voulu faire ca.
Le problème de créer un thread séparé, c'est qu'il ne comprend pas repaint...
Car il se trouve dans une autre classe...
Et le update(g) arrivait bien a changer l'image quand il y en avait plusieurs.
Enfin je vais reessayer le coup du thread ;)

Edit :

import java.awt.* ;
public class defaut extends java.applet.Applet{
String d ;
int a = 0 ;
long tempsactuel = 10000 ;
long tempsancien = 10 ;
public void init() {
thread th = new thread() ;
th.start() ;
}
public void paint (Graphics g)
{
if(tempsactuel >= (tempsancien + 1000))
{
d = "http://192.168.1.62/IMAGE.JPG" ;
tempsancien = tempsactuel;
tempsactuel = 0 ;
a++;
}
else
{
tempsactuel = System.currentTimeMillis();
}
Image im ;
im = getImage(getCodeBase() , d) ;
prepareImage(im,this) ;
boolean b = g.drawImage(im,0,0, this ) ;
if (b == false)
{
System.out.println("image pas actualisé") ;
}
else
{
System.out.println("image actualisé") ;
}
setBackground(Color.white) ;
try
{
}
catch (StackOverflowError e){System.out.println("Stack error") ;}
}

}
class thread extends Thread
{
defaut gra = new defaut() ;
public void run()
{
for (int i =0 ; i <10000000 ; i ++)
{

gra.repaint() ;
}
}
}

Voilà le code threadé, l'image ne se rafraichit pas.

TrizoLakai
29/08/2007, 17h01
Je ne connais pas JAVA et je ne sais pas si ça va t'avancer mais pourquoi tu ne change pas le nom de ton image à chaque passage dans la boucle ?

genre
IMAGE1.JPG
IMAGE2.JPG

avec un int i_; par exemple en membre de la classe ?

slade
29/08/2007, 17h05
Parcqu'il n'y a qu'une seul image en fait sur la camera et j'ai pas les droits pour la modifier de toute facon.
C'est la même image qui est écrasé 20 fois par secondes.