# Url und lokales Bild laden



## TheDestroyer (7. Dez 2006)

Hey, hab hier zwar schonmal in einem anderen Teil des Forums die Frage gestellt, denke aber das sie hier passender ist. Und zwar hab ich ein Programm in welches ich ein Bild von meinem Rechner und eines von einer URL hineinladen soll, nebeibei auch noch ein paar Formen und Linien (diese machen mir aber kein Problem). Das Problem liegt daran das mir mein Bild von meinem Rechner gar nicht erst angezeigt wird. Weiss das ich das in der Paint-Methode irgendwie einfügen muss, aber wie. Glaube auch das in meiner Methode private BufferedImage loadLocalImage(){
noch ein Fehler ist. Kann mir vielleicht jemand von euch helfen. Muss den Code für das lokale Reinladen in dieser Methode belassen. Hatte es zwar schon alles direkt bei Paint drinnen, welches auch klappt, aber wie gesagt es soll in die Methode, deshalb hab ich jetzt nochmal einen neuen Weg eingeschlagen.

Danke schonmal!!!

Hier mein Code:

```
package org.uni_md.pum;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;

import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JComponent;

/**
 * Diese Klasse beschreibt das Zeichenpanel.
 * Sie erbt von JComponent so das man sie leicht in einen JFrame integrieren
 * kann. Ihr sollt nun im wesentlichen die Methode "JComponent.paint(Graphics)"
 * überschreiben.
 *
 * @author Christian Wasserthal, Lars Stockmann, [your name here :)]
 */
public class GraphicsComponent extends JComponent{

	// Diese Variable könnt ihr erstmal ignorieren.
	private static final long serialVersionUID = 1L;

	public final String STR_IMAGE_LOCAL = "my_picture.png";
	public final String STR_IMAGE_URL = "http://www.gnu.org/graphics/gnu-head-banner.png";


	public GraphicsComponent(){
		// Wenn ihr globale Variablen für eure Animation braucht oder Bilder
		// laden wollt, solltet ihr das hier tun, damit es nicht bei jedem
		// repaint neu geladen werden muss.




	}

	@Override public void paint(Graphics g){
		// Die folgende Zeile ruft die überschriebene Methode auf. Das ist in
		// den meisten Fällen Empfehlenswert. In diesem Fall sorgt es zum
		// Beispiel dafür, dass die Hintergrundfarbe eurer JComponent sich dem
		// Look and Feel (Theme) des Frames anpasst.
		super.paint(g);
		//Formen(g);
		

	     // BufferedImage auto = new BufferedImage(500, 400, BufferedImage.TYPE_INT_ARGB); 
	     // ImageIcon image = new ImageIcon("my_picture.png"); 
	     // Graphics2D g2d2 = auto.createGraphics(); 
	     // g2d2.drawImage(image.getImage(), 300, 0, this);
	     // g.drawImage(auto, 0, 0, this);

		

		/* TODO
		 * Benutze das Grapphics Objekt g und zeichne mindestens eine Linie, einen
		 * Kreis.
		 */
		
	    Formen(g);
	    
	    

		/* TODO
		 * Zeichne ein Bild aus dem Internet (z.B. STR_IMAGE_URL).
		 * Implementiere dazu (in Anlehnung an "loadLocalImage(String)") eine
		 * Methode zum laden von Bildern aus dem Internet.
		 */

	}
	
	public void Formen(Graphics g){
		Graphics2D g2d = (Graphics2D) g;
		
		g2d.setColor(Color.blue);
		g2d.drawArc(150, 100, 60, 60, 45, 360 );  // Kreis
		g2d.drawOval(150,200, 60,80);			  // Kreis
		g2d.drawLine(20, 300, 300, 20);			  // Linie
		g2d.drawRoundRect(10, 100, 50, 42, 5, 5); // rundes Rechteck
		g2d.fillRect(20, 10, 50, 50);			  // gefülltes Rechteck
	}

	
	private BufferedImage loadLocalImage(){
		BufferedImage image = null; 
	    try { 
	        // von file 
	        File file = new File("image.gif"); 
	        image = ImageIO.read(file); 
	    
	        // von input stream 
	        InputStream is = new BufferedInputStream( 
	            new FileInputStream("image.gif")); 
	        image = ImageIO.read(is); 
	    
	         
	    } catch (IOException e) { 
	    }

		
		
		
	}

	/**
	 * Diese Methode wird von dem Button "Single Step" oder dem Timer
	 * aufgerufen, der mit "Start Animation" aktiviert wird.
	 */
	public void animate(){
		/* TODO (für überflieger)
		 *
		 * Wenn ihr auf "Single Step" oder "Start Animation" klickt, wird jedes
		 * mal bevor neu gezeichnet wird diese Methode aufgerufen. Diese
		 * Tatsache könnt ihr benutzen um eine kleine Animation zu realisieren.
		 */



	}

}
```


----------



## André Uhres (7. Dez 2006)

```
...
public class GraphicsComponent extends JComponent{
...
    private BufferedImage image;
    public GraphicsComponent(){
...        
        image = loadLocalImage();
    }
    
    @Override public void paint(Graphics g){
...
        g.drawImage(image,0,0,null);
    }
    private BufferedImage loadLocalImage(){
        BufferedImage image = null;
        try {
            // von file
            File file = new File("image.gif");
            image = ImageIO.read(file);
            
            // von input stream
//            InputStream is = new BufferedInputStream(
//                    new FileInputStream("image.gif"));
//            image = ImageIO.read(is);
            
            
        } catch (IOException e) {
        }
        return image;
    }
...
}
```


----------



## TheDestroyer (7. Dez 2006)

Danke, hab ich gemacht. Jetzt kann er  allerdings bei GraphicComponent und bei paint nicht mit image anfangen (ist halt rot unterstrichen). Wie bekomme ich das weg?


----------



## André Uhres (7. Dez 2006)

Haste image deklariert? (Siehe Zeile 4 in meinem Code)


----------



## TheDestroyer (7. Dez 2006)

danke das klappt jetzt. nur noch eine Frage. Wie bekomme ich es hin das ich ein Url einfüge, etwa http://www.gnu.org/graphics/gnu-head-banner.png? Das kann ich doch nicht einfach  dort einsetzen wo vorher der Dateipfad war, oder? Es klappt jedenfalls nicht.
Danke


----------



## André Uhres (8. Dez 2006)

TheDestroyer hat gesagt.:
			
		

> ..Wie bekomme ich es hin das ich ein Url einfüge..


Du kannst der "read"-Methode eine URL als Parameter geben. Beispiel:

```
private URL url;{
            try {url = new URL("http://www.gnu.org/graphics/gnu-head-banner.png");
            } catch (MalformedURLException e) {e.printStackTrace();}
        }
        private Image img;{
            try {img = ImageIO.read(url);
            } catch (IOException e) {e.printStackTrace();}
        }
```


----------



## TheDestroyer (8. Dez 2006)

Soll die url-Methode mit dem BufferedReader machen. Kann man deine Methode dafür verwenden?
Danke nochmal!


----------



## André Uhres (8. Dez 2006)

Meinste sowas: InputStream is = new BufferedInputStream(url.openStream());


----------



## TheDestroyer (8. Dez 2006)

ja genau, soetwas meine ich. kann ich das jetzt direkt so nehmen, oder muss da noch mehr hin?


----------



## André Uhres (8. Dez 2006)

"image = ImageIO.read(is); " haste ja, sonst brauchste nix.


----------



## TheDestroyer (8. Dez 2006)

sieht jetzt so aus:

```
private BufferedImage loadURLImage(){ 
        BufferedImage image_url = null; 
        try { 
            
            
            // von input stream 
        	InputStream is = new BufferedInputStream(url.openStream("http://www.gnu.org/graphics/gnu-head-banner.png"));
           // InputStream is = new BufferedInputStream( 
             //      new FileInputStream("image.gif")); 
            image = ImageIO.read(is); 
            
            
        } catch (IOException e) { 
        } 
        return image_url; 
    }
```

und bei paint so:

```
g.drawImage(image_url,450,200,null);
```

bei loadURLImage muss noch nen Fehler sein- in Zeile 8 bei url.OpenStream und bei paint unter image_url.


----------



## André Uhres (8. Dez 2006)

Wenn du Variablennamen änderst (image-->image_url), dann musst du sie auch überall ändern:

```
image_url = ImageIO.read(is);
```


----------



## TheDestroyer (8. Dez 2006)

sorry, aber das klappt dann immer  noch nicht.


```
package org.uni_md.pum;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;

import javax.imageio.*;
import javax.swing.JComponent;


public class GraphicsComponent extends JComponent{

	// Diese Variable könnt ihr erstmal ignorieren.
	private static final long serialVersionUID = 1L;

	public final String STR_IMAGE_LOCAL = "my_picture.png";
	public final String STR_IMAGE_URL = "http://www.gnu.org/graphics/gnu-head-banner.png";
	 private BufferedImage image;	// für lokale Datei
	 

	public GraphicsComponent(){
		image = loadLocalImage(); 
		image =loadURLImage();

	}

	@Override public void paint(Graphics g){
		super.paint(g);
		
		g.drawImage(image,450,0,null); 
		
		
	    /* TODO
		 * Benutze das Grapphics Objekt g und zeichne mindestens eine Linie, einen
		 * Kreis.
		 */
		Formen(g);
	    
	    /* TODO
		 * Zeichne ein Bild aus dem Internet (z.B. STR_IMAGE_URL).
		 * Implementiere dazu (in Anlehnung an "loadLocalImage(String)") eine
		 * Methode zum laden von Bildern aus dem Internet.
		 */
	    g.drawImage(image,450,200,null);
	    //g.drawImage(bild, 0, 0, null);
	}
	
	public void Formen(Graphics g){
			
		Graphics2D g2d = (Graphics2D) g; // für blau
		g2d.setColor(Color.DARK_GRAY);
		
				
	}
	
	/*
	 * von lokaler Datei laden
	 */
	private BufferedImage loadLocalImage(){ 
        BufferedImage image = null; 
        try { 
             
            File file = new File(STR_IMAGE_LOCAL); 
            image = ImageIO.read(file); 
                      
            
        } catch (IOException e) { 
        	System.err.println("Fehler beim laden des lokalen Bildes "
					+ STR_IMAGE_LOCAL + ": "+e.getMessage());
        } 
        return image; 
    } 
	/*
	 * von URL laden
	 */
	private BufferedImage loadURLImage(){ 
        BufferedImage image_url = null; 
        try { 
            
            
            // von input stream 
        	InputStream is = new BufferedInputStream(url.openStream("http://www.gnu.org/graphics/gnu-head-banner.png")); 

           // InputStream is = new BufferedInputStream( 
             //      new FileInputStream("image.gif")); 
            image_url = ImageIO.read(is); 
            
            
        } catch (IOException e) { 
        } 
        return image_url; 
    } 




	/**
	 * Diese Methode wird von dem Button "Single Step" oder dem Timer
	 * aufgerufen, der mit "Start Animation" aktiviert wird.
	 */
	public void animate(){
		/* TODO (für überflieger)
		 *
		 * Wenn ihr auf "Single Step" oder "Start Animation" klickt, wird jedes
		 * mal bevor neu gezeichnet wird diese Methode aufgerufen. Diese
		 * Tatsache könnt ihr benutzen um eine kleine Animation zu realisieren.
		 */



	}

}
```


----------



## André Uhres (8. Dez 2006)




----------



## TheDestroyer (9. Dez 2006)

also ich weiß echt nicht wo der Fehler liegt. habe doch eigentlich alles befolgt, wie du es geschrieben hast. habe es auch mir dem komentierten Teil aus deinem ersten Beitrag genutzt, aber kalppt leider auch nicht. Kannst du mir nicht sagen wie ich es hinbekomme, oder wo der Fehler liegt.
Habe hier nochmal die wichtigsten Teile:

```
package org.uni_md.pum;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;

import javax.imageio.*;
import javax.swing.JComponent;


public class GraphicsComponent extends JComponent{

	// Diese Variable könnt ihr erstmal ignorieren.
	private static final long serialVersionUID = 1L;

	public final String STR_IMAGE_LOCAL = "F:/Eigene Dateien/Eclipse/Tutorium/Tut4/my_picture.png";
	public final String STR_IMAGE_URL = "http://www.gnu.org/graphics/gnu-head-banner.png";
	 private BufferedImage image;	// für lokale Datei
	 private BufferedImage bild;

	public GraphicsComponent(){
		image = loadLocalImage(); 
		bild = loadUrlImage();

	}

	@Override public void paint(Graphics g){
		super.paint(g);
		
		g.drawImage(image,450,0,null); 
		
		
	    /* TODO
		 * Benutze das Grapphics Objekt g und zeichne mindestens eine Linie, einen
		 * Kreis.
		 */
		Formen(g);
	    
	    /* TODO
		 * Zeichne ein Bild aus dem Internet (z.B. STR_IMAGE_URL).
		 * Implementiere dazu (in Anlehnung an "loadLocalImage(String)") eine
		 * Methode zum laden von Bildern aus dem Internet.
		 */
	    //g.drawImage(image,450,200,null);
	    g.drawImage(bild, 0, 0, null);
	}
	
	public void Formen(Graphics g){
			....
		
	}
	
	/*
	 * von lokaler Datei laden
	 */
	.....

	/*
	 * von URL laden
	 */
	private BufferedImage loadUrlImage(){ 
        BufferedImage bild = null; 
        try { 
            
            
            // von input stream 
        	 InputStream is = new BufferedInputStream(url.openStream());
            bild = ImageIO.read(is); 
            
            
        } catch (IOException e) { 
        } 
        return bild; 
    } 






}
```


----------



## André Uhres (9. Dez 2006)

Gut, den InputStream haste richtig angepasst. Jetzt brauchste nur noch die URL anpassen.
Einfach die URL genauso erzeugen wie ich es dir gezeigt habe:
http://www.java-forum.org/de/viewtopic.php?p=244578#244578


----------



## TheDestroyer (9. Dez 2006)

Danke klappt. ISt das so jetzt richtig? Meine das auch der BufferedReader richtig verwendet wird. Ein Frage noch was kann ich für eine exception angeben (beim loadImagaUrl) unter catch, sodass er mir angibt das ein file eventuell nicht vorhanden ist? Kann man diese nehmen: catch (IOException e) { e.printStackTrace(); ????

```
package org.uni_md.pum;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;

import javax.imageio.*;
import javax.swing.JComponent;


public class GraphicsComponent extends JComponent{

	// Diese Variable könnt ihr erstmal ignorieren.
	private static final long serialVersionUID = 1L;

	public final String STR_IMAGE_LOCAL = "F:/Eigene Dateien/Eclipse/Tutorium/Tut4/my_picture.png";
	public final String STR_IMAGE_URL = "http://www.gnu.org/graphics/gnu-head-banner.png";
	 private BufferedImage image;	// für lokale Datei
	 private BufferedImage image_url;

	public GraphicsComponent(){
		image = loadLocalImage(); 
		image_url = loadUrlImage();

	}

	@Override public void paint(Graphics g){
		super.paint(g);
		
		g.drawImage(image,450,0,null); 
		
		
	    /* TODO
		 * Benutze das Grapphics Objekt g und zeichne mindestens eine Linie, einen
		 * Kreis.
		 */
		Formen(g);
	    
	    /* TODO
		 * Zeichne ein Bild aus dem Internet (z.B. STR_IMAGE_URL).
		 * Implementiere dazu (in Anlehnung an "loadLocalImage(String)") eine
		 * Methode zum laden von Bildern aus dem Internet.
		 */
	    
	    g.drawImage(image_url, 450, 200, null);
	}
	
	public void Formen(Graphics g){
			
		Graphics2D g2d = (Graphics2D) g; // für blau
		g2d.setColor(Color.DARK_GRAY);
		
		//Dach
		g2d.drawLine(90, 30, 30, 90);			  
		g2d.drawLine(90, 30, 150, 90);
		//Haus
		g2d.drawRect(30, 90, 120, 120);
		//Fenster links
		g2d.drawRect(45, 105, 30, 30);
		//Fenster rechts
		g2d.drawRect(105, 105, 30, 30);
		//Tür			  
		g2d.drawRect(75, 165, 30, 45);
		
		//Baum A
		g2d.drawLine(225, 165, 225, 210);
		g2d.drawLine(255, 165, 255, 210);	
		
		g2d.drawLine(240, 60, 195, 165);
		g2d.drawLine(240, 60, 285, 165);
		g2d.drawLine(240, 90, 195, 195);
		g2d.drawLine(240, 90, 285, 195);
		
		// Baum B
		g2d.drawLine(345, 165, 345, 210);
		g2d.drawLine(375, 165, 375, 210);
		g2d.drawArc(315, 76, 90, 90, 360, 360);
		
	}
	
	/*
	 * von lokaler Datei laden
	 */
	private BufferedImage loadLocalImage(){ 
        BufferedImage image = null; 
        try { 
             
            File file = new File(STR_IMAGE_LOCAL); 
            image = ImageIO.read(file); 
                      
            
        } catch (IOException e) { 
        	System.err.println("Fehler beim laden des lokalen Bildes "
					+ STR_IMAGE_LOCAL + ": "+e.getMessage());
        } 
        return image; 
    } 
	
	/*
	 * url deklarieren
	 */
	private URL url;{ 
        try {url = new URL(STR_IMAGE_URL); 
        } catch (MalformedURLException e) {e.printStackTrace();} 
    } 
   

	/*
	 * von URL laden
	 */
	private BufferedImage loadUrlImage(){ 
        BufferedImage image_url = null; 
        try { 
            InputStream is = new BufferedInputStream(url.openStream());
            image_url = ImageIO.read(is); 
            
            
        } catch (IOException e) { 
        } 
        return image_url; 
    } 


	/**
	 * Diese Methode wird von dem Button "Single Step" oder dem Timer
	 * aufgerufen, der mit "Start Animation" aktiviert wird.
	 */
	public void animate(){
		/* TODO (für überflieger)
		 *
		 * Wenn ihr auf "Single Step" oder "Start Animation" klickt, wird jedes
		 * mal bevor neu gezeichnet wird diese Methode aufgerufen. Diese
		 * Tatsache könnt ihr benutzen um eine kleine Animation zu realisieren.
		 */



	}

}
```


----------

