# Bild aus unterferzeichniss Laden



## Guest (29. Jun 2007)

Ich hab nach einem tag im web hunderte von wege gefunden. Keiner functioniert fuer meine zwecke :bahnhof: .
Hat jemand ein applet das mit einer classe (nicht main) ein bild aus einem unterferzeichniss ladet? bitte nur ganze applets da es mich ueberfordert sachen auszuffuellen (hab noch nie mit images gearbeitet). bitttte sagt nicht ich soll mihr erst die basics erarbeiten den ich finde keine tutorials die mihr das lernen. Fals es eine tutorial gibbt die sowas kann koennt ihr mich natuerlich auch dahin deuten  .


----------



## The_S (29. Jun 2007)

Nachdem das hier in Aufgaben und Gesuche steht:

Sag mir was du bietest und was du detailliert willst und du bekommst es von mir  .

btw: Ich bin ja auch nicht unbedingt dafür, dass man im www mit der Rechtschreibung alles so eng sehen muss, aber dein Post überschreitet da eine gewisse Grenze ...


----------



## moormaster (29. Jun 2007)

Hobbit_Im_Blutrausch hat gesagt.:
			
		

> btw: Ich bin ja auch nicht unbedingt dafür, dass man im www mit der Rechtschreibung alles so eng sehen muss, aber dein Post überschreitet da eine gewisse Grenze ...



Das ist nur eine Frage der Syntax- (und manchmal auch Grammatik-) Toleranz


----------



## Gast (29. Jun 2007)

Ich moechte eine class die ich in mein applet einbinden kann.
Diese class solte eine .gif datei laden aus einem folder wo sich das applet befindet.

beispiel:

projectfolder // da ist alles drin
-applet.class // Main Class
-bildlader.class // Hilfs Class (soll gif datei laden)
-somefolder // irgendein folder mit bilder drin
--gifdatei.gif // das bild hier soll geladen werden

Danke fuers lesen

P.S. mit bild


----------



## The_S (29. Jun 2007)

Und was bieteste dafür?

Aber mal ehrlich, so schwer ist das nicht! Dazu gibt es sogar einen FAQ-Beitrag. Du musst nur ein bisschen selbst rumprobieren und bei konkreten Fragen bekommst du auch hilfe für lau  .


----------



## Gast (29. Jun 2007)

so weit bin ich jezt mit der methode 


```
public Image Picture;

public void Load(String Path)
{
        Picture = null;    
        // Get the image
        File file = new File(Path);
        try                              {Picture = ImageIO.read(file);} 
        catch (IOException e)   {e.printStackTrace();}
        // and load it
        MediaTracker mt = new MediaTracker(this); 
        mt.addImage(Picture,0); 
        try                                            {mt.waitForID(0);} 
        catch(InterruptedException ex)   {ex.printStackTrace();}
}
```

java hat problem auf der folgenden zeile

```
MediaTracker mt = new MediaTracker(this);
```
und das problem lautet:

```
The constructor MediaTracker(Tile) is undefined
```
wie behebe ich das?


----------



## The_S (29. Jun 2007)

Na also, dann ahst du doch schonmal einen Ansatz, und somit gehört das nicht in "Aufgaben und Gesuche". Ein Mod oder Admin wird das Topic sicher für dich verschieben  .

MediaTracker benötigt als Übergabeparameter eine Klasse, die direkt oder indirekt Component erbt, was deine Klasse scheinbar nicht tut. Das ist aber ohnehin sinnlos, da du dein Bild über ImageIO lädst. Bei ImageIO benötigst du keinen MediaTracker mehr.

btw: Variablen schreibt man gewöhnlich klein


----------



## Gast (29. Jun 2007)

So (wie weise ich das reultat zu?)?:


```
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import java.awt.*;  

public class ImageLoader 
{

private Image picture;

public Image Load(String path)
 {
	// Read from a file
    File file = new File(path);
    try {picture = ImageIO.read(file);} 
    catch (IOException e) {e.printStackTrace();}
    Load = picture;     ///////////////////// Error ////////////////////////
[size=9] // Load the image (not needed)
    //MediaTracker mt = new MediaTracker(this); 
    //mt.addImage(Picture,0); 
    //try { 
    //  mt.waitForID(0); 
    //} catch(InterruptedException ex) 
    //{ 
    //  ex.printStackTrace(); 
    //}[/size]
 }
    
}
```


----------



## The_S (29. Jun 2007)

warum? Das "resultat" (Bild) wird doch schon in der Klassenvariablen picture gespeichert ???:L


----------



## moormaster (29. Jun 2007)

Gast hat gesagt.:
			
		

> ```
> Load = picture;     ///////////////////// Error ////////////////////////
> ```



Du weisst aber schon, wie Methoden (insbesondere deren Rückgabewerte) in Java funktionieren?
Load = picture und ähnliche Scherze gibt es vielleicht in anderen Sprachen, aber in Java gibt es dafür return.

z.B.

```
int add(int a, int b)
 {
  return a+b;
 }
```

Allerdings solltest du dich mal entscheiden, ob das Image nun direkt in die picture-Eigenschaft deines Objektes geschrieben werden soll oder ob die Methode das Bild zunächst nur als Rückgabewert liefert. Beides gleichzeitig ist irgendwie unschön.


----------



## Gast (29. Jun 2007)

So?  :? :


```
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import java.awt.*;  

public class ImageLoader {

private Image picture;

public Image Load(String path)
 {
    File file = new File(path);
    try {picture = ImageIO.read(file);} 
    catch (IOException e) {e.printStackTrace();}
    return picture;
 }

}
```

Das bild soll direct als rueckgabewert geliefert werden das es kein speicher fergeudet.

so klappts aber nicht:

```
try {return ImageIO.read(file);}
```


----------



## The_S (29. Jun 2007)

Eine Klassenvariable zurückzugeben geht zwar, ist aber bei dieser Methode recht sinnfrei. Entweder load und dann über getter und setter abfragen, oder load und keine Klassenvariable  .

Wenn etwas nicht geht, immer dazuschreiben was nicht geht + evtl. Fehlermeldung!


----------



## moormaster (29. Jun 2007)

Sprich was Hobbit_Im_Blutrausch meint:

entweder


```
import java.io.File;
 import java.io.IOException;
 import javax.imageio.ImageIO;
 import java.awt.*;  

 public class ImageLoader {

  private Image picture;

  public Image Load(String path)
  {
   Image picture; // lokale Variable innerhalb der Methode anlegen

   File file = new File(path);
   try {
    picture = ImageIO.read(file); // in lokaler Variable das Image zwischenspeichern
   }
   catch (IOException e) {
    e.printStackTrace();
   }
    
   return picture; //lokale Variable zurückgeben
  }
 }
```

oder ohne Rückgabewert:

```
import java.io.File;
 import java.io.IOException;
 import javax.imageio.ImageIO;
 import java.awt.*;  

 public class ImageLoader {

  private Image picture;

  public void Load(String path)
  {
   File file = new File(path);
   try {
    picture = ImageIO.read(file); // Image in Klassenvariable speichern
   }
   catch (IOException e) {
    e.printStackTrace();
   }
  }

  // Methode zum Abfragen des Images aus der Klassenvariable
  public Image getPicture()
  {
   return this.picture;
  }
 }
```


----------



## Guest (29. Jun 2007)

ich hab das obere genommen aber eclipse unterstreicht mihr das hier in rot:

```
return picture; //lokale Variable zurückgeben
```
 und sagt das es villeaicht nicht initiallisiert worden ist. Das ist aber ok den es ist doch mit

```
picture = ImageIO.read(file); // in lokaler Variable das Image zwischenspeichern
```
initialisiert worden oder?

das andere unterstreicht er mihr mit gelb:

```
private Image picture;
```
und sagt mihr das es nie benuezt worden ist. kann ich das radieren :?: 

ihr seit risige hilfe


----------



## The_S (29. Jun 2007)

bie der initialisierung 


```
Image picture = null;
```


----------



## Gast (29. Jun 2007)

immernoch rot unterstrichen :

```
import java.io.File; 
import java.io.IOException; 
import javax.imageio.ImageIO; 
import java.awt.*;  

public class ImageLoader { 

 //private Image picture;  // wenn das hier ist wird das andere als duplicat markiert :(

  public Image Load(String path) 
  { 
   Image picture = null;// lokale Variable innerhalb der Methode anlegen 
 
   File file = new File(path); 
   try { 
    picture = ImageIO.read(file); // in lokaler Variable das Image zwischenspeichern 
   } 
   catch (IOException e) { 
    e.printStackTrace(); 
   } 
    
   return picture; //lokale Variable zurückgeben 
  } 
  
}
```


----------



## moormaster (29. Jun 2007)

Ich bleib doch dabei:

"rot unterstrichen" ist keine brauchbare Fehlerbeschreibung


----------



## The_S (29. Jun 2007)

Wenn du mit ImageIO liest, solltest du den Rückgabewert in ein BufferedImage speichern.


----------



## Gast (29. Jun 2007)

BufferedImage canot be resolved to a type 
@moorm(a/on)ster picture mit not have been initialized


----------



## moormaster (29. Jun 2007)

Gast hat gesagt.:
			
		

> BufferedImage canot be resolved to a type
> @moorm(a/on)ster picture mit not have been initialized



import java.awt.image.*;

oder java.awt.image.BufferedImage benutzen (ist aber unübersichtlicher)


----------



## The_S (29. Jun 2007)

mit diesem Code kannst du diese Fehlermeldung definitiv beim return nicht erhalten!


----------



## Gast (29. Jun 2007)

Eclipse hat keine probleme mehr damit    ihr seit klasse  :applaus: 


```
import java.io.File; 
import java.io.IOException; 
import javax.imageio.ImageIO; 
import java.awt.*;  
import java.awt.image.*; 

public class ImageLoader { 

 //private Image picture; 

  public Image Load(String path) 
  { 
   BufferedImage picture = null;// lokale Variable innerhalb der Methode anlegen 
 
   File file = new File(path); 
   try { 
    picture = ImageIO.read(file); // in lokaler Variable das Image zwischenspeichern 
   } 
   catch (IOException e) { 
    e.printStackTrace(); 
   } 
    
   return picture; //lokale Variable zurückgeben 
  } 
  
}
```

jezt zu meim anwendungs code:


```
// Variablen
public Image Picture;
private ImageLoader loader;

// Anwendungs Form
Picture = loader.Load("test.gif");
```

ich kriege eine java.lang.NullPointerExceptionauf der anwendungs linie.  ???:L 

ich habe ein gif image who 'test' (ohne ') heisst in dehm gleichen folder wie die loader class.


----------



## The_S (29. Jun 2007)

Zum Testen würd ich erstmal immer einen festen Pfad angeben. Relative Pfade gehen immer vom Ausführungsverzeichnis aus!


----------



## Gast (29. Jun 2007)

immer noch nullpointerexception.

hab pfad zu: "C:\\Java\\MMORPG\\test.gif getauscht"

habs auch geprueft indem ich \\ durch \ ersezt hab und der IExplorer hats dan oeffnen koennen.


----------



## Gast (29. Jun 2007)

btw MMORPG steht nicht fuer das was du denkst


----------



## The_S (29. Jun 2007)

Nich? Steht nicht für Massiv-Multiplayer-Online-Rollenspiel? 

Zeig nochmal die genau Exception mit Zeilenangaben!


----------



## Gast (29. Jun 2007)

die exception:

```
java.lang.NullPointerException
	at Main.init(Main.java:24)
	at sun.applet.AppletPanel.run(Unknown Source)
	at java.lang.Thread.run(Unknown Source)
```

die ganze main class:

```
import java.applet.*; 
import java.awt.*; 
import java.awt.event.*; 
//import java.util.*; 
  
public class Main extends Applet 
implements MouseMotionListener,MouseListener,Runnable

{
  
	boolean running;
	boolean Down;
	Thread UpdaterThread;
	Graphics bufferg; 
	Image bufferi;
	Dimension bufferdim; 
	Font MyFont;
	Image Picture;
	ImageLoader loader;
	
	public void init() 
    { 

		Picture = loader.Load("C:\\Java\\MMORPG\\test.gif");
////////////////////////////////////////////////////////////////////////////////////////////////////
	
		UpdaterThread = new Thread(this);
   	    UpdaterThread.start();
   	    setSize(700,500);
        bufferdim = getSize(bufferdim);
	    bufferi = createImage(bufferdim.width,bufferdim.height); 
	    bufferg = bufferi.getGraphics();
	    setBackground(Color.black);
	    MyFont = new Font("Arial",Font.ITALIC,16);
	    addMouseListener(this);
	    addMouseMotionListener(this); 
		running = true;
    }
	
	public void stop() 
    { 
		
    }
	
	public void paint(Graphics g) 
    { 
		bufferg.setColor(Color.black);
        bufferg.fillRect(0,0,bufferdim.width,bufferdim.height);
        bufferg.setFont(MyFont);
       // bufferg.drawImage(Picture, 0, 0, this);
        
        // Paint End
		g.drawImage(bufferi,0,0,this); 
		
    }
	
	public void run() 
    { 
         while (running) 
         { 
        	 // Update Stuff
         }
    }
	
    public void update(Graphics g) 
    { 
     paint(g); 
    }
    
	public void destroy() 
    { 
     running = false; 
     UpdaterThread = null; 
    }

	 // Mouse Events
    public void mouseMoved(MouseEvent me)  
    {  
    // Nothing 
    }
    
    public void mouseDragged(MouseEvent me)  
    { 
    // Nothing 
    } 

    public void mouseClicked (MouseEvent me) 
    {
    // Nothing 
    } 
    
    public void mouseEntered (MouseEvent me) 
    {
    // Nothing 
    } 
    
    public void mousePressed (MouseEvent me) 
    {
    Down = true;	
    } 
    
    public void mouseReleased (MouseEvent me) 
    {
    Down = false;
    }  
    
    public void mouseExited (MouseEvent me) 
    {
    // Nothing 
    }  	
	
}
```

Nee, Steht nicht für Massiv-Multiplayer-Online-Rollenspiel. im moment ists noch geheim. (mein welt-eroberungs plan)


----------



## Gast (29. Jun 2007)

sry die erste zeile ist lehr... nicht im echten code


----------



## The_S (29. Jun 2007)

1. Variablen und Methodennamen schreibt man klein
2. Wenn du ein BufferedImage lädst, solltest du auch im kompletten Code weiterhin mit einem BufferedImage arbeiten
3. Sicher, dass in loader.Load keine Exception gefangen und ausgegeben wird?


----------



## Gast (29. Jun 2007)

1. sry
2. die function gibt jezt ein BufferedImage zurueck und picture in der main methode ist jezt auch ein bufferedimage.
3. Wie mache ich da sicher? in der console fand ich nichts...


----------



## The_S (29. Jun 2007)

Im catch gibts du ja den Fehler aus. Wenn also in der Konsole nichts steht, gibts auch kein Fehler  . Das einzige was ich mir dann noch vorstellen könnte, wäre evtl. eine Fehlerhafte bilddatei. Erstell einfach mal ein z. B. einfarbiges, rotes rechteck mit paint und speicher das als jpg ab. Und versuch das dann mal zu laden.


----------



## Gast (29. Jun 2007)

:x  klappt immer noch nicht  :cry: 
liegts villeicht an der sandbox oder so was?
klappts bei dir (nur mahl so)?

Zip mit main,imageloader,test.jpg:
http://www.mediafire.com/?45m9ldg19dd


----------



## The_S (29. Jun 2007)

Hm, kann die Datei nicht runterladen. Steht ewig da, dass der Download geladen wird. 

Wenn es an der Sandbox liegen würde, würdest du eine andere Exception bekommen!


----------



## Gast (29. Jun 2007)

... was heist den nullpointexception? das man auf was zugreifen moechte was nicht da ist?


----------



## The_S (29. Jun 2007)

Das du auf ein Objekt zugreifen möchtest, das null also nicht initialisiert ist.


----------



## moormaster (29. Jun 2007)

Ist doch klar! Um mal früher geposteten Code zurückzugreifen:


```
private ImageLoader loader;

// Anwendungs Form
Picture = loader.Load("test.gif");
```

So kann das nicht funktionieren, wenn nicht noch vorher (z.B. im Konstruktor) loader = new ImageLoader();

Die Variable ist nach der Deklaration:
private ImageLoader loader;

erstmal null.

demzufolger muss loader.Load zu einer NullpointerException führen.



Ich frage mich angesichts des Quelltextes der ImageLoader Klasse:

```
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import java.awt.*; 
import java.awt.image.*;

public class ImageLoader {

//private Image picture;

  public Image Load(String path)
  {
   BufferedImage picture = null;// lokale Variable innerhalb der Methode anlegen

   File file = new File(path);
   try {
    picture = ImageIO.read(file); // in lokaler Variable das Image zwischenspeichern
   }
   catch (IOException e) {
    e.printStackTrace();
   }
   
   return picture; //lokale Variable zurückgeben
  }
 
}
```

aus welchem Grund diese Methode nicht static ist. Wenn sie static wäre könnte man sich den quatsch sparen, für den Aufruf jedes Mal Speicher für eine Instanz von ImageLoader zu reservieren, nur um die load Methode aufzurufen:


```
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import java.awt.*; 
import java.awt.image.*;

public class ImageLoader {

//private Image picture;

  public staticImage load(String path)
  {
   BufferedImage picture = null;// lokale Variable innerhalb der Methode anlegen

   File file = new File(path);
   try {
    picture = ImageIO.read(file); // in lokaler Variable das Image zwischenspeichern
   }
   catch (IOException e) {
    e.printStackTrace();
   }
   
   return picture; //lokale Variable zurückgeben
  }
 
}
```

Aufruf wäre dann so:

```
ImageLoader.load("Pfad\\Bild.jpg");
```


----------



## Gast (30. Jun 2007)

:applaus:   *kreish* :applaus:  *freudentanzauffuer*
ihr habt mihr seeeehr geholfen. Ich kann jezt bilder laden  !

@moormaster
du hast eine zu vielle von dehn } hingetan und der output war nicht buffered image aber war schnell gefixt. 

final code:

class:

```
import java.io.File; 
import java.io.IOException; 
import javax.imageio.ImageIO; 
import java.awt.*;  
import java.awt.image.*; 

public class ImageLoader { 


	public static BufferedImage load(String path)
	  { 
	   BufferedImage picture = null;
	   File file = new File(path); 
	   try { 
	    picture = ImageIO.read(file);
	   } 
	   catch (IOException e) { 
	    e.printStackTrace(); 
	   } 
	    
	   return picture;
	  } 

}
```

aufruf:

```
loader = new ImageLoader(); 
Picture = loader.load("C:\\Java\\MMORPG\\test.jpg");
```

variablen zum aufruf:

```
BufferedImage Picture;
ImageLoader loader;
```

ich denke jezt zurueck an meine alte sprache *traeum* da konnte man dies machen:
image.loadfromfile('crap.bmp');

noch eine einzige frage: ist der loader auch platformsunabhaengig (wenn ich jpg's benuezte)?


----------



## The_S (2. Jul 2007)

1. Alles, was du direkt aus Java ohne zusätzliche Libs programmieren kannst ist natürlich Plattformunabhängig
2. Was soll das mit dem Format einer Grafikdatei zu tun haben?


----------

