Bilder einlese und bearbeiten

Status
Nicht offen für weitere Antworten.

TheDestroyer

Aktives Mitglied
Hallo, habe zur Zeit folgende Aufgabe:

Die Kasse GraphicsComponent soll nun so modifiziert werden, dass folgende Aufgaben erfüllt sind:

1. Es ist eine Methode zu implementieren, die ein Bild von einer URL aus dem Internet lädt und ein BufferedImage
zurückgibt. Eine Methode, die das mit einer lokalen Datei macht ist bereits vorhanden und soll als Vorlage dienen.
2. Mit Hilfe dieser beiden Methoden zum Laden eines Bildes sollen im Konstruktor mindestens ein lokales Bild und
eines aus dem Internet geladen werden.
3. In der Methode paint sollen dann beide Bilder plus mindestens eine Linie und ein Kreis gezeichnet werden.

Habe folgenden Code:

Code:
package Tut4;

import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.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";


	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){
		
		super.paint(g);

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

		/* 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.
		 */

	}


	private BufferedImage loadLocalImage(String filename){
		try{
			return ImageIO.read(new File(filename));
		}
		catch(IOException e){
			System.err.println("Fehler beim laden des lokalen Bildes "
					+ filename + ": "+e.getMessage());
			return null;
		}
	}
	
	private BufferedImage loadUrlImage(String filename){
		try{
			return ImageIO.read(new File(filename));
		}
		catch(IOException e){
			System.err.println("Fehler beim laden des lokalen Bildes "
					+ filename + ": "+e.getMessage());
			return null;
		}
	}
	

	/**
	 * 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.
		 */



	}

}

und

Code:
package Tut4;

import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.TimerTask;
import java.util.Timer;
import javax.swing.JButton;
import javax.swing.JFrame;

/**
 * Diese Klasse beschreibt den Frame und die Buttons.
 *
 * @author Christian Wasserthal, Lars Stockmann
 */
public class GraphicsGUI{

	/**
	 * Die main()-Methode erzeugt eine Instanz der Klasse GraphicsGUI und lässt
	 * sie anzeigen.
	 * @param args wird ignoriert
	 */
	public static void main(String[] args){
		GraphicsGUI gui = new GraphicsGUI();
		gui.show();
	}

	// Das sind die Variablen einer Instanz
	JFrame frame;
	JButton buttonStep,buttonAnim;
	GraphicsComponent panel;

	/**
	 * Der Constructor initialisiert die Instanzvariablen und startet den
	 * Timer.
	 */
	public GraphicsGUI(){
		// Wir verwenden ein und den selben Listener für alle auftretenden
		// Events. Das werden zum einen GUI-Events sein (also wenn ein Button
		// gedrückt wird) und zum anderen der Timer.
		GUIAction guiAction = new GUIAction();

		// Initialisierung des Panels das ihr Programmieren sollt.
		panel = new GraphicsComponent();

		// initialisierung der buttons
		buttonStep = new JButton("Single Step");
		buttonAnim = new JButton("Start Animation");

		// hinzufügen des ActionListeners der aufgerufen wird, wenn ein Button
		// gedrückt wird.
		buttonStep.addActionListener(guiAction);
		buttonAnim.addActionListener(guiAction);

		// Die Buttons kommen in einen extra Container der im unteren Teil des
		// Fensters zu sehen sein wird.
		Container cont = new Container();
		cont.setLayout(new FlowLayout());
		cont.add(buttonStep);
		cont.add(buttonAnim);

		// initialisierung des Frames
		frame = new JFrame("Grafik GUI");

		// Konfiguration des Frames
		frame.setSize(640,480);
		frame.setLocation(100,50);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

		// Beschreibung des Layouts
		frame.getContentPane().setLayout(new BorderLayout());
		frame.getContentPane().add(panel,BorderLayout.CENTER);
		frame.getContentPane().add(cont,BorderLayout.SOUTH);

		// hier erstellen wir einen Timer, der dann alle 20ms die Methode
		// "guiAction.run()" aufruft.
		Timer t = new Timer();
		t.scheduleAtFixedRate(guiAction,20,20);
	}

	
	public void show(){
		frame.setVisible(true);
	}

	private class GUIAction extends TimerTask implements ActionListener{

		private boolean running;

		public GUIAction(){
			running=false;
		}

		// ActionListener
		public void actionPerformed(ActionEvent e) {
			if (e.getSource() == buttonAnim){
				running=!running;
				buttonAnim.setText(running?"Stop Animation":"Start Animation");
			}
			else if (e.getSource() == buttonStep && !running){
				panel.animate();
				panel.repaint();
			}
		}

		// TimerTask
		@Override public void run(){
			if (running){
				panel.animate();
				panel.repaint();
			}
		}

	}

}

Leider lädt er mir bisher die Bilder nicht rein? Wie kann ich das denn machen? Wie bekomme ich es hin das später mindestens eine Linie und ein Kreis hinein gezeichnet werden. Kann man das automatisch machen lassen oder muss ich das dann sleber machen.

THX !!!!!
 
öhm ja :shock:
zimlich viel Code schreib einfach das nötigste
um ein bild zu malen benutzt man Graphics.drawImage()
für eine Linie Graphics.drawLine()
und für einnen Kreis Graphics.drawOval()
 
ja das hab ich jetzt hinbekommen. soweit ich verstanden hab muss ich auf die bilder, welche ich ladn soll direkt draufmalen. leider lädt er mir die bilder nicht rein. kann mir jemand sagen wie ich es hinbekomme das die beiden bilder hingeladen werden.
THX!!!!

P.S. Sorry für den vielen Code
 
sowas macht man dublebuffering doch such ma
dafür brauchst du aber ein BufferedImage
 
ich hab doch oben:

public final String STR_IMAGE_LOCAL = "my_picture.png";
angegeben.
wie kann ich den jetzt beim einlesen meiner lokalen datei diesen String benutzen. ICh muss ja bei filename den Pfad eingeben, leider klappt das bei mir net. Laut Aufgabenstellung müsste ja mit den Buttons ja bereits alles klappen, sodass ws an denen ja nicht liegen kann.
Hier nochmal die Methode zum Einlesen. Hoffe ihr könnt mir helfen.
Code:
private BufferedImage loadLocalImage(String filename){
				
		try{
			return ImageIO.read(new File(filename));
		}
		catch(IOException e){
			System.err.println("Fehler beim laden des lokalen Bildes "
					+ filename + ": "+e.getMessage());
			return null;
		}
	}
 
Wenn du nicht unbedingt ein BufferedImage brauchst, wovon ich mal ausgehe, kannst du das auch ohen den Umweg über File machen:

Code:
 Image picture = new ImageIcon(path).getImage();

malen geht dann einfach mit

Code:
public void paintComponent(Graphics g) {
    super.paintComponent(g);
    g.drawImage(picture, 0, 0, null);
}
 
gehe mal davon aus das ich bei "Image picture = new ImageIcon(path).getImage(); " bei path meinen Dateinamen einsetzten muss, sodass die Initialisierung jtt so aussieht:

Image picture = new ImageIcon("my_picture.png").getImage();
public final String STR_IMAGE_URL = "http://www.gnu.org/graphics/gnu-head-banner.png";

Wenn ich das Prog jetzt aber starte, passiert mal wieder nicht. KAnn mir jemand helfen, der vielleicht weiss wo denn das Prob liegt.
 
oder kann mir wenigstens jemand sagen, ob mein
private BufferedImage loadLocalImage(String filename){
richtig ist. Muss es doch dann in die paint methode einfügen, oder. Aber wie macht man das, sodass das Prog anschliessend auch richtig läuft????
 
Ja das funzt.


Mal ein Tipp: Gibt mal den absoluten Pfad für dein Bild ein. Dann klappts auch. Dannach kannst du ja immer noch rausfinden wie dein relativer Pfad aussieht.
 
also da klppt bei mir dann leider auch nichts. gebe "C:\test.png"; ein. aber wenn ich das Programm starte, führen die beiden Buttons keine Fkt. aus.
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben