Bild aus unterferzeichniss Laden

Status
Nicht offen für weitere Antworten.
G

Guest

Gast
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 :oops: .
 

The_S

Top Contributor
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

Top Contributor
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 :D
 
G

Gast

Gast
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

Top Contributor
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 ;) .
 
G

Gast

Gast
so weit bin ich jezt mit der methode :)

Code:
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
Code:
MediaTracker mt = new MediaTracker(this);
und das problem lautet:
Code:
The constructor MediaTracker(Tile) is undefined
wie behebe ich das?
 

The_S

Top Contributor
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
 
G

Gast

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

Code:
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

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

moormaster

Top Contributor
Gast hat gesagt.:
Code:
    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.
Code:
 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.
 
G

Gast

Gast
So? :? :

Code:
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:
Code:
try {return ImageIO.read(file);}
 

The_S

Top Contributor
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

Top Contributor
Sprich was Hobbit_Im_Blutrausch meint:

entweder

Code:
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:
Code:
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;
  }
 }
 
G

Guest

Gast
ich hab das obere genommen aber eclipse unterstreicht mihr das hier in rot:
Code:
return picture; //lokale Variable zurückgeben
und sagt das es villeaicht nicht initiallisiert worden ist. Das ist aber ok den es ist doch mit
Code:
picture = ImageIO.read(file); // in lokaler Variable das Image zwischenspeichern
initialisiert worden oder?

das andere unterstreicht er mihr mit gelb:
Code:
private Image picture;
und sagt mihr das es nie benuezt worden ist. kann ich das radieren :?:

ihr seit risige hilfe :D
 
G

Gast

Gast
immernoch rot unterstrichen :(:
Code:
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 
  } 
  
}
 
G

Gast

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

Gast

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

Code:
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:

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

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

Gast

Gast
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.
 

The_S

Top Contributor
Nich? Steht nicht für Massiv-Multiplayer-Online-Rollenspiel? ;)

Zeig nochmal die genau Exception mit Zeilenangaben!
 
G

Gast

Gast
die exception:
Code:
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:
Code:
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)
 

The_S

Top Contributor
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?
 
G

Gast

Gast
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

Top Contributor
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.
 

The_S

Top Contributor
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!
 
G

Gast

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

moormaster

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

Code:
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:
Code:
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:

Code:
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:
Code:
ImageLoader.load("Pfad\\Bild.jpg");
 
G

Gast

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

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

final code:

class:
Code:
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:
Code:
loader = new ImageLoader(); 
Picture = loader.load("C:\\Java\\MMORPG\\test.jpg");

variablen zum aufruf:
Code:
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

Top Contributor
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?
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Oben