edebroMedlem sedan aug. 2001261 inlägg Jag håller på med en applet som ska göra så att jag kan skicka ut bilder från min webbkamera så att det blir strömmande.
Jag använder mig av programmet ConquerCam för att generera bilderna, sen hämtar jag upp den bilden med min applet och visar som en film på webbsidan.
Hursomhelst......hur får jag bilden att uppdateras. Just nu laddar den bara in "första" bilden....sen slutar den.
Jag vill altså att den ska uppdatera bilden och visa den nya.
Här är min kod iaf
<font size="1" face="Verdana, Arial, Helvetica, sans-serif">Kod:<font size="1" face="Verdana, Arial, Helvetica, sans-serif" color="#666600">
import java.awt.*;
public class webcam extends java.applet.Applet implements Runnable {
Thread trad;
Image bild;
public void init() {
bild = getImage(getCodeBase(), "webcam.jpg");
}
public void start() {
if (trad == null); {
trad = new Thread(this);
trad.start();
}
}
public void stop() {
if (trad != null) {
trad.stop();
trad = null;
}
}
public void run() {
while (1\<2) {
bild = getImage(getCodeBase(), "webcam.jpg");
repaint();
try { Thread.sleep(1000); }
catch (InterruptedException e) { }
}
}
public void paint(Graphics g) {
g.drawImage(bild,10,50,this);
}
}
------------------
Mikael Edebro
http://divx.edebro.net
PeWMedlem sedan juni 200010 432 inlägg Tja... du laddar ju bara in bilden en gång med init()... lägg in inladdningen av bilden eller anrop av en metod som gör det i run ist.
Risken är sen att du får flimmer med eller annat konstigt, men det kan du ju avhjälpa med dubbelbuffring.
------------------
Ancilla, face mea laganum!
ToonsterMedlem sedan feb. 20001 590 inlägg Ändra så att tråden med jämna mellanrum anropar en funktion som läser in den nya bilden. För att undvika flimmer, läs in den nya bilden i en minnesbuffert, kopiera sedan denna minnesbuffert till skärmen.
/T
------------------
Jensen Ambassadör, mitt bästa köp! www.jensen.no
[Redigerat av Toonster den 23 dec 2001]
edebroMedlem sedan aug. 2001261 inlägg okej. Sen till ett annat problem. Eftersom jag är ganska mybörjare på java så vill jag gärna slippa använda nån krånglig editor med en massa onödiga funktioner(för nybörjaren)
Så jag tänkte att jag skulle börja använda command prompten för att kompilera(jag har använt JBuilder förr)
Det går bra att kompilera med JBuilder fast när jag gör det genom commandprompten( javac filnamn.java) så står det så här(jag kompilerar med -deprecation):
webcam.java:20: warning: stop() in java.lang.Thread has been deprecated
trad.stop();
det verkar vara så att inte funktionen stop() går att använda eller?
Det som är irriterande är att det fungerar med JBuilder fast inte utan : /
Väldigt tacksam för snabbt svar
------------------
Mikael Edebro
http://divx.edebro.net
edebroMedlem sedan aug. 2001261 inlägg hmm...det löste tyvärr inte problemet med att ta bort bildinladdningen från init()
just nu ser min kod ut så här:
<font size="1" face="Verdana, Arial, Helvetica, sans-serif">Kod:<font size="1" face="Verdana, Arial, Helvetica, sans-serif" color="#666600">
import java.awt.*;
import java.lang.*;
public class webcam extends java.applet.Applet implements Runnable {
Thread trad;
Image bild;
public void init() {
//bild = getImage(getCodeBase(), "webcam.jpg");
}
public void start() {
if (trad == null); {
trad = new Thread(this);
trad.start();
}
}
public void stop() {
if (trad != null) {
trad.stop();
trad = null;
}
}
public void run() {
while (1\<2) {
bild = getImage(getCodeBase(), "webcam.jpg");
repaint();
try { Thread.sleep(1000); }
catch (InterruptedException e) { }
}
}
public void paint(Graphics g) {
g.drawImage(bild,10,50,this);
}
}
jag har altså kommenterat bort bildinladdningen i init() och laddar bara bilden i run().........fast den vill forfarande bara visa den först bilden
Om nån vill visa på min kod skulle jag vara mycket tacksam
------------------
Mikael Edebro
http://divx.edebro.net
SPiNMedlem sedan mars 20007 896 inlägg Tja, du anropar ju endast den första bilden i din while-loop. Så det är ju inte så konstigt...
------------------
SPiN, bjorne.w@telia.com
-- En ask vet jag stånda - den Yggdrasil heter, ett väldigt träd överöst av vita sanden. --
edebroMedlem sedan aug. 2001261 inlägg nja.....eller joo
Men det är så här....jag använder ett program som heter ConquerCam som skriver används för att ta bilder från webbkameran. Sen har jag ställt in den att ta en bild i sekunden. Och den skriver ju över den förra bilden så att inte hårddisken ska fyllas med en massa bilder
Då är det tänkt att min applet ska ladda den bilden........sen efter en sekund....ladda in den nya versionen av bilden(som ConquerCam har genererat) osv osv
Så det handlar bara om bild altså...som ska uppdateras i appleten.
Hur göres?
Man kan ju tycka att när den kommer till loopen så borde den ju ladda in en ny version av bilden varje gång loopen körs....men så är inte fallet
PS. det är altså en väldigt enkel applet jag ska göra.....bara som täcker mina behov :)
------------------
Mikael Edebro
http://divx.edebro.net
PeWMedlem sedan juni 200010 432 inlägg Toonster >>
Funktion? :OO :p
edebro >>
Du kanske får sätta bild till null innan... ? DVS:-> bild = null; på raden innan du hämtar bilden.
Den gamla bilden kanske ligger kvar i nån cache... annars brukar man ju slänga in bilderna i en array av bilder och plocka ut dem en och en...
------------------
Ancilla, face mea laganum!
[Redigerat av PeW den 23 dec 2001]
edebroMedlem sedan aug. 2001261 inlägg
annars brukar man ju slänga in bilderna i en array av bilder och plocka ut dem en och en...
fast det känns ju lite onödigt när det bara är en bild eller vad tycker du?
------------------
Mikael Edebro
http://divx.edebro.net
edebroMedlem sedan aug. 2001261 inlägg hmm...........det fungerade inte heller med att sätta variabeln bild till null
bild = null;
faan vad störande..............finns det ingen sån här grej då
bild = new Image("bild.gif", 10, 10)
eller ngt liknande?
------------------
Mikael Edebro
http://divx.edebro.net
PeWMedlem sedan juni 200010 432 inlägg Tja, det kan nog funka bättre att skapa ett helt nytt bildobjekt varje gång. *Skräpsamlaren kastar väl bort de gamla bilderna ;) *
Du kan ju även kolla på Suns tutor om Image: http://java.sun.com/docs/books/tutorial/uiswing/painting/loadingImages.html
------------------
Ancilla, face mea laganum!
edebroMedlem sedan aug. 2001261 inlägg
*Skräpsamlaren kastar väl bort de gamla bilderna*
jag antar att du var sarkastisk.....men vad menar du egentligen. Jag antar att det du menade var att det suger upp minne om man skapar ett nytt bildobjekt varje gång.....eller?
Men hur faan ska man lösa det då. Det verkade ju inte fungera. Vad störande.
Är det jävligt svårt att hämta data från USB:n och visa den på nåt sätt i en applet, video dvs
Fast jag antar att jag inte ens ska försöka med ngt sånt ;)
------------------
Mikael Edebro
http://divx.edebro.net
PeWMedlem sedan juni 200010 432 inlägg edebro>>
Det var inte alls menat som sarkastiskt när jag tog upp garbage collector. Du ville ju hålla ned minnesutnyttjandet och genom skräpsamlaren rensas de de gamla objekten bort om man ropar på konstruktorn varje varv i slingan.
Jag har inte själv gjort exakt det du vill göra, men däremot har jag plockat in diverse bilder i en array och hämtat dessa vid behov. Det fungerade utmärkt. Det som kan vara ett problem i ditt fall är kanske inte själva omladdningen av bilden utan rensningen av bufferten (strömmen). Progget laddar mycket riktigt in den nya bilden från streamen men i streamen ligger ju den gamla bilden kvar så den nya bilden blir lika med den gamla ... *en teori*
Har du kollat den länken jag gav dig?
I suns tutor eller reference kanske du kan få ihop en egen snutt där du kan kontrollera streamen och rensa den.
Tyvärr verkar det som att de som vet bättre än jag gått på julledigt eller nåt, men jag kanske ger dig lite uppslag iaf?.
------------------
Ancilla, face mea laganum!
edebroMedlem sedan aug. 2001261 inlägg tack för svaren. Orsaken att jag inte visste om du var sarkastisk eller inte är att jag inte ens vet vad skräpsamlaren är ;)
Man kan även kalla mig nybörjare
Det skulle vara jävligt läckert om man kunde hämta data direkt från USB:n, så man slipper använda ConquerCam, och även visa mer än 1 bild i sekunden
Fast jag antar att det är oerhört svårt. Jag har ingen aning om hur det fungerar, måste man implementera några drivrutiner till webcamen eller är sånt där standard?
Altså ungefär så man bara behöver läsa kontinuerligt från USB kontakten eller?
Om nån har gjort ngt liknande så skulle jag uppskatta en liten genomgång hur det går till
Gott nytt år alla
------------------
Mikael Edebro
http://divx.edebro.net
SPiNMedlem sedan mars 20007 896 inlägg Jag har för mig att du måste gå via JNI för att kunna läsa av hårdvaruenheter. Kolla runt lite på http://java.sun.com efter JNI kanske du hittar något intressant. :)
------------------
SPiN, bjorne.w@telia.com
-- En ask vet jag stånda - den Yggdrasil heter, ett väldigt träd överöst av vita sanden. --
PeWMedlem sedan juni 200010 432 inlägg edebro >>
Grov förenklad förklaring om skräpsamlaren:
Skräpsamlaren håller "rent" genom att frigöra minne som inte används... i många andra programmeringsspråk måste man först tala om hur mycket minne man behöver och sen ta bort det innan man avslutar programmet eller går ut ett objekt.
I java behöver man inte tänka så mycket på detta utan kan blåsa på ganska friskt - om man nu inte är ute efter att optimera förståss.. ;)
Således menade jag att om man skapar ett nytt bildobjekt med referens (ordet "bild" i ditt fall) ovan på ett annat objekt med samma referens kastas det gamla i skräphögen och städas undan automagiskt.
Vad det gäller ditt "problem" kan du ju dels kolla mitt tips och/eller följa farbror SPiN's goda råd :)
Men det borde ju finnas nån som gjort detta tidigare så sök av genom google oxå ;)
------------------
Ancilla, face mea laganum!
SPiNMedlem sedan mars 20007 896 inlägg
...följa farbror SPiN's goda råd
Bah, sen när blev jag farbror? Jag är ju ung! :D ;)
[Redigerat av SPiN den 30 dec 2001]
PeWMedlem sedan juni 200010 432 inlägg men lill-pöjken då :p §e
------------------
Ancilla, face mea laganum!
Jag har för mig att jag har gjort något liknande för läänge sedan. Har du provat att göra .flush() på bild objektet? jag har för mig att det tömmer "cachen"
NNÄÄj :)
jag tror att det oxå kan vara lite mera komplicerat änn så..
Prova med att göra så här
URLConnection myConnection = new URLConnection(myURL);//där myURL är urlen du vill hämta bilden från;
myConnection.setUseCaches(false);
URL myNocachURL = myConnection.GetURL();
// nu har du en nocachad URL som du kan använda för att hämta bilden
[Redigerat av Dinodipp den 30 dec 2001]