/ Forside / Teknologi / Udvikling / Java / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
Java
#NavnPoint
molokyle 3688
Klaudi 855
strarup 740
Forvirret 660
gøgeungen 500
Teil 373
Stouenberg 360
vnc 360
pmbruun 341
10  mccracken 320
Image.getWidth() returnerer -1
Fra : Brian Søgaard


Dato : 04-07-01 13:21

Hej.

Jeg har et problem med getWidth() og getHeight()-metoderne i Image.
Hvis jeg laver et Image-objekt ud fra et ImageIcon, kan jeg godt kalde
metoderne (med null som parameter) - og få returneret den korrekte bredde og
højde.
Hvis jeg derimod får et Image efter getImage()-metoden på Toolkit,
returnerer de 2 metodekald -1.
De to instanser laves med
Image my_image = new ImageIcon( imageFile.getPath() ).getImage();
Image my_image = Toolkit.getDefaultToolkit().getImage(
imageFile.getPath() );

hvor imageFile er et File-objekt der repræsenterer mit image (et
JPG-billede).

Hvorfor kan jeg ikke bare bruge ImageIcon, når det virker? - Jo, grunden er,
at de billeder jeg behandler er op til godt 70 MB, og så brokker programmet
sig under runtime, med fejlen "java.lang.OutOfMemoryError". Denne fejl
kommer ikke hvis jeg anvender Toolkit.

Hvis en af jer har et forslag til hvordan jeg får getWidth og getHeight til
at virke efter hensigten, er jeg meget interesseret i at høre om det.

På forhånd tak.


Hilsen
Brian Søgaard






 
 
Claus E. Petersen (04-07-2001)
Kommentar
Fra : Claus E. Petersen


Dato : 04-07-01 22:19

Så vidt jeg husker bruger java noget tid på at hente billedet ind, så man
skal "polle" indtil billedet er indlæst.
Jeg fandt en lille stump kode der vist nok gør præcist det:

int imgWidth = 0;
int imgHeight = 0;
while ((imgHeight = image.getHeight(this)) == -1 ) {}
while ((imgWidth = image.getWidth(this)) == -1 ) {}

Håber at det kan bruges.

- Claus E. Petersen


"Brian Søgaard" <brian@unlimited.dk> wrote in message
news:3b430a1d$0$9450$4d4eb98e@news.dk.uu.net...
> Hej.
>
> Jeg har et problem med getWidth() og getHeight()-metoderne i Image.
> Hvis jeg laver et Image-objekt ud fra et ImageIcon, kan jeg godt kalde
> metoderne (med null som parameter) - og få returneret den korrekte bredde
og
> højde.
> Hvis jeg derimod får et Image efter getImage()-metoden på Toolkit,
> returnerer de 2 metodekald -1.
> De to instanser laves med
> Image my_image = new ImageIcon( imageFile.getPath() ).getImage();
> Image my_image = Toolkit.getDefaultToolkit().getImage(
> imageFile.getPath() );
>
> hvor imageFile er et File-objekt der repræsenterer mit image (et
> JPG-billede).
>
> Hvorfor kan jeg ikke bare bruge ImageIcon, når det virker? - Jo, grunden
er,
> at de billeder jeg behandler er op til godt 70 MB, og så brokker
programmet
> sig under runtime, med fejlen "java.lang.OutOfMemoryError". Denne fejl
> kommer ikke hvis jeg anvender Toolkit.
>
> Hvis en af jer har et forslag til hvordan jeg får getWidth og getHeight
til
> at virke efter hensigten, er jeg meget interesseret i at høre om det.
>
> På forhånd tak.
>
>
> Hilsen
> Brian Søgaard
>
>
>
>
>



Lars Hansen (05-07-2001)
Kommentar
Fra : Lars Hansen


Dato : 05-07-01 06:46

ellers kan du bruge java.awt.MediaTracker til at holde styr på om billedet
er loaded

/Lars Hansen
"Claus E. Petersen" <snurrberget@yahoo.com> wrote in message
news:3b438883$0$289$edfadb0f@dspool01.news.tele.dk...
> Så vidt jeg husker bruger java noget tid på at hente billedet ind, så man
> skal "polle" indtil billedet er indlæst.
> Jeg fandt en lille stump kode der vist nok gør præcist det:
>
> int imgWidth = 0;
> int imgHeight = 0;
> while ((imgHeight = image.getHeight(this)) == -1 ) {}
> while ((imgWidth = image.getWidth(this)) == -1 ) {}
>
> Håber at det kan bruges.
>
> - Claus E. Petersen
>
>
> "Brian Søgaard" <brian@unlimited.dk> wrote in message
> news:3b430a1d$0$9450$4d4eb98e@news.dk.uu.net...
> > Hej.
> >
> > Jeg har et problem med getWidth() og getHeight()-metoderne i Image.
> > Hvis jeg laver et Image-objekt ud fra et ImageIcon, kan jeg godt kalde
> > metoderne (med null som parameter) - og få returneret den korrekte
bredde
> og
> > højde.
> > Hvis jeg derimod får et Image efter getImage()-metoden på Toolkit,
> > returnerer de 2 metodekald -1.
> > De to instanser laves med
> > Image my_image = new ImageIcon( imageFile.getPath() ).getImage();
> > Image my_image = Toolkit.getDefaultToolkit().getImage(
> > imageFile.getPath() );
> >
> > hvor imageFile er et File-objekt der repræsenterer mit image (et
> > JPG-billede).
> >
> > Hvorfor kan jeg ikke bare bruge ImageIcon, når det virker? - Jo, grunden
> er,
> > at de billeder jeg behandler er op til godt 70 MB, og så brokker
> programmet
> > sig under runtime, med fejlen "java.lang.OutOfMemoryError". Denne fejl
> > kommer ikke hvis jeg anvender Toolkit.
> >
> > Hvis en af jer har et forslag til hvordan jeg får getWidth og getHeight
> til
> > at virke efter hensigten, er jeg meget interesseret i at høre om det.
> >
> > På forhånd tak.
> >
> >
> > Hilsen
> > Brian Søgaard
> >
> >
> >
> >
> >
>
>



Jacob Møller (05-07-2001)
Kommentar
Fra : Jacob Møller


Dato : 05-07-01 08:39


"Lars Hansen" <spam@el-lal.dk> wrote in message
news:9i0v1p$28jc$1@news.cybercity.dk...
> ellers kan du bruge java.awt.MediaTracker til at holde styr på om billedet
> er loaded
>

Nej, han SKAL bruge mediatrackeren. Den anden fremsatte løsning medfører
konsekvenser der absolut ikke er ønskelige (eksempelvis bruges al
cpu-kraften, mens billedet måske hentes)...

Med venlig hilsen,
Jacob Møller
www.kiloo.dk




Brian Matzon (05-07-2001)
Kommentar
Fra : Brian Matzon


Dato : 05-07-01 09:53

"Jacob Møller" <jacob@jvector.dk> wrote in message
news:9i15fh$2f5c$1@news.cybercity.dk...
>
> "Lars Hansen" <spam@el-lal.dk> wrote in message
> news:9i0v1p$28jc$1@news.cybercity.dk...
> > ellers kan du bruge java.awt.MediaTracker til at holde styr på om
billedet
> > er loaded
> >
>
> Nej, han SKAL bruge mediatrackeren. Den anden fremsatte løsning medfører
> konsekvenser der absolut ikke er ønskelige (eksempelvis bruges al
> cpu-kraften, mens billedet måske hentes)...
>
Bob bob... kan godt gøres uden mediatrackeren:

Toolkit tk = Toolkit.getDefaultToolkit();
Image image = tk.getImage(filename);
tk.prepareImage(image,-1,-1,this);
synchronized (this) {
try {
this.wait();
}catch (Exception e) {
e.printStackTrace();
}
}

Men jeg fortrækker også MediaTracker :))

ps. Ovenstående kode virker kun hvis man selv er ImageObserver...

/Brian Matzon




Thorbjørn Ravn Ander~ (08-08-2001)
Kommentar
Fra : Thorbjørn Ravn Ander~


Dato : 08-08-01 01:37

Brian Matzon skrev i meddelelsen ...

>tk.prepareImage(image,-1,-1,this);
>synchronized (this) {
> try {
> this.wait();
> }catch (Exception e) {
> e.printStackTrace();
> }
>}
>
>Men jeg fortrækker også MediaTracker :))
>
>ps. Ovenstående kode virker kun hvis man selv er ImageObserver...


Og ikke andet, vel?

Der er vel andre mekanismer der sender signaler? At hænge på en
udokumenteret implementation og uspecificerede signaler, er vel ikke det
mest portable man kan forvente? (Optimized for Sun JDK-1.2 or higher?).

Thorbjørn

--






Brian Matzon (08-08-2001)
Kommentar
Fra : Brian Matzon


Dato : 08-08-01 14:52

"Thorbjørn Ravn Andersen" <thunderbear@bigfoot.com> wrote in message
news:jc1qk9.eb.ln@10.10.1.1...
> Brian Matzon skrev i meddelelsen ...
>
> >tk.prepareImage(image,-1,-1,this);
> >synchronized (this) {
> > try {
> > this.wait();
> > }catch (Exception e) {
> > e.printStackTrace();
> > }
> >}
> >
> >Men jeg fortrækker også MediaTracker :))
> >
> >ps. Ovenstående kode virker kun hvis man selv er ImageObserver...
>
>
> Og ikke andet, vel?
>
> Der er vel andre mekanismer der sender signaler? At hænge på en
> udokumenteret implementation og uspecificerede signaler, er vel ikke det
> mest portable man kan forvente? (Optimized for Sun JDK-1.2 or higher?).
>
> Thorbjørn

Jeg tror ikke jeg forstår...
Mener du at man ikke kan være sikker på at den enkelte build af
en VM ikke nødvendigvis kalder notify?

/Brian Matzon



Brian Søgaard (05-07-2001)
Kommentar
Fra : Brian Søgaard


Dato : 05-07-01 13:45

Tak for jeres respons.
Jeg har forsøgt mig med MediaTrackeren. - Med både positiv og negativ
resultat!

Jeg benytter denne kode:

Image image = Toolkit.getDefaultToolkit().getImage( imageFile.getName() );
MediaTracker tracker = new MediaTracker( new Button("") );
tracker.addImage( image, 0 );
try {
tracker.waitForAll();
}
catch (InterruptedException e) {
e.printStackTrace();
}

Grunden til jeg "sviner koden til" med Button er, at hverken null eller this
virker, da jeg ikke anvender et Component.

Den positive del er, at jeg nu kan benytte getWidth() og getHeight().
Den negative del er, at der nu ved runtime fremkommer en
java.lang.OutOfMemoryError, som da jeg benyttede ImageIcon. Der er masser af
fri memory!

Nogle forslag?


Hilsen
Brian Søgaard


"Jacob Møller" <jacob@jvector.dk> wrote in message
news:9i15fh$2f5c$1@news.cybercity.dk...
>
> "Lars Hansen" <spam@el-lal.dk> wrote in message
> news:9i0v1p$28jc$1@news.cybercity.dk...
> > ellers kan du bruge java.awt.MediaTracker til at holde styr på om
billedet
> > er loaded
> >
>
> Nej, han SKAL bruge mediatrackeren. Den anden fremsatte løsning medfører
> konsekvenser der absolut ikke er ønskelige (eksempelvis bruges al
> cpu-kraften, mens billedet måske hentes)...
>
> Med venlig hilsen,
> Jacob Møller
> www.kiloo.dk
>
>
>



Brian Matzon (05-07-2001)
Kommentar
Fra : Brian Matzon


Dato : 05-07-01 14:52

"Brian Søgaard" <brian@unlimited.dk> wrote in message
news:3b446148$0$13369$4d4eb98e@read.news.dk.uu.net...
> Tak for jeres respons.
> Jeg har forsøgt mig med MediaTrackeren. - Med både positiv og negativ
> resultat!
>
> Jeg benytter denne kode:
>
> Image image = Toolkit.getDefaultToolkit().getImage( imageFile.getName() );
> MediaTracker tracker = new MediaTracker( new Button("") );
> tracker.addImage( image, 0 );
> try {
> tracker.waitForAll();
> }
> catch (InterruptedException e) {
> e.printStackTrace();
> }
>
> Grunden til jeg "sviner koden til" med Button er, at hverken null eller
this
> virker, da jeg ikke anvender et Component.
>
> Den positive del er, at jeg nu kan benytte getWidth() og getHeight().
> Den negative del er, at der nu ved runtime fremkommer en
> java.lang.OutOfMemoryError, som da jeg benyttede ImageIcon. Der er masser
af
> fri memory!
>
> Nogle forslag?

Njaa....:
1. Du bør bruge den component billedet skal tegnes på som image observer.
2. Sæt heap størrelsen op -mx128 f.eks.

/Brian Matzon



Brian Søgaard (05-07-2001)
Kommentar
Fra : Brian Søgaard


Dato : 05-07-01 15:17

"Brian Matzon" <brian@matzon.dk> wrote in message
news:wg_07.5732$DJ5.435624@news010.worldonline.dk...
> > Den positive del er, at jeg nu kan benytte getWidth() og getHeight().
> > Den negative del er, at der nu ved runtime fremkommer en
> > java.lang.OutOfMemoryError, som da jeg benyttede ImageIcon. Der er
> > masser af fri memory!
> > Nogle forslag?
> Njaa....:
> 1. Du bør bruge den component billedet skal tegnes på som image observer.
Klart. - HVIS jeg skulle tegne billedet på et Component, men det skal jeg
ikke.
Applikationen behandler et stort JPG-billede (op til 10100x6200 pixels) ved
at beskære det ud fra nogle beregnede koordinater. Disse "småstykker"
konverteres til PPM-format, og skrives til disken.
Pga. de store JPG-billeder programmet skal behandle, er der åbenbart
problemer med memory (selvom billedet kan være i memory flere gange inden
det bliver fyldt). - Derfor må memory-problemet ligge her... .

> 2. Sæt heap størrelsen op -mx128 f.eks.
Godt forslag! Kan du give et lille hint? Hvordan / hvor sættes denne
heap-størrelse?


Hilsen
Brian Søgaard



Brian Matzon (05-07-2001)
Kommentar
Fra : Brian Matzon


Dato : 05-07-01 15:31

"Brian Søgaard" <brian@unlimited.dk> wrote in message
news:3b4476d8$0$9449$4d4eb98e@read.news.dk.uu.net...
> "Brian Matzon" <brian@matzon.dk> wrote in message
> news:wg_07.5732$DJ5.435624@news010.worldonline.dk...
> > > Den positive del er, at jeg nu kan benytte getWidth() og getHeight().
> > > Den negative del er, at der nu ved runtime fremkommer en
> > > java.lang.OutOfMemoryError, som da jeg benyttede ImageIcon. Der er
> > > masser af fri memory!
> > > Nogle forslag?
> > Njaa....:
> > 1. Du bør bruge den component billedet skal tegnes på som image
observer.
> Klart. - HVIS jeg skulle tegne billedet på et Component, men det skal jeg
> ikke.
> Applikationen behandler et stort JPG-billede (op til 10100x6200 pixels)
ved
> at beskære det ud fra nogle beregnede koordinater. Disse "småstykker"
> konverteres til PPM-format, og skrives til disken.
> Pga. de store JPG-billeder programmet skal behandle, er der åbenbart
> problemer med memory (selvom billedet kan være i memory flere gange inden
> det bliver fyldt). - Derfor må memory-problemet ligge her... .
>
> > 2. Sæt heap størrelsen op -mx128 f.eks.
> Godt forslag! Kan du give et lille hint? Hvordan / hvor sættes denne
> heap-størrelse?
>
Du skriver bare: Java -mx128 classfil
hvor 128 er max heap
du kan også bruge -msXXX hvor XXX er minimum heapsize.
Da du bruger store billeder kunne du derfor starte din application således:
java -ms128 -mx256 classfil

Du kan kun stille på heapsizen hvis dit program er en applikation.

/Brian Matzon



Thorbjørn Ravn Ander~ (08-08-2001)
Kommentar
Fra : Thorbjørn Ravn Ander~


Dato : 08-08-01 01:39

Brian Søgaard skrev i meddelelsen
<3b446148$0$13369$4d4eb98e@read.news.dk.uu.net>...

>Den positive del er, at jeg nu kan benytte getWidth() og getHeight().
>Den negative del er, at der nu ved runtime fremkommer en
>java.lang.OutOfMemoryError, som da jeg benyttede ImageIcon. Der er masser
af
>fri memory!


Jeg har uden problemer behandlet meget store data i Java. Det kræver dog
med Suns Java at man angiver "-mx300m" for at få 300 Mb arbejdsplads.
Microsofts java har ikke et loft og er derfor ofte nemmere at bruge.

THorbjørn



Søg
Reklame
Statistik
Spørgsmål : 177501
Tips : 31968
Nyheder : 719565
Indlæg : 6408527
Brugere : 218887

Månedens bedste
Årets bedste
Sidste års bedste