Bild-Datein "zuschneiden"

LukLuk

Aktives Mitglied
Heho zusammen,
Ich wollte mal fragen ob es in Java eine Methode gibt die es erlaubt von Bild-Dateien nur bestimmte Teile zu laden und zB. in ein JPanel einfügt.

Ich kenne bis jetzt nur die Methode wo man das ganze Bild lädt.
Java:
import java.awt.*;
import javax.swing.*;
public class Bildtest {
	 public Bildtest () {
	        JFrame f = new JFrame();
	        f.setLayout(new FlowLayout());
	        
	        MyPanel panel = new MyPanel(Toolkit.getDefaultToolkit().getImage("test2.png"));
	            panel.add(new JButton("Huhu"));
	        f.setContentPane(panel);
	        
	        f.setSize(400, 300);
	        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	        f.setVisible(true);
	    }
	    

	    
	    class MyPanel extends JPanel {
	 
	        private Image image;
	 
	        MyPanel(Image image) {
	            this.image = image;
	            repaint();
	        }
	        
	        public void paintComponent(Graphics g) {
	            g.drawImage(image, 0, 0, null);
	        }
	    }
}
 

dayaftereh

Top Contributor
Du könntest dir das Bild als [JAPI]BufferedImage[/JAPI] laden und dann mit [JAPI]getSubimage(int x, int y, int w, int h)/JAPI] ein Teilbild heraus schneiden und diese Teilbild im [JAPI]JPanel[/JAPI] Anzeigen.
 

The_S

Top Contributor
Du könntest dir das Bild als [JAPI]BufferedImage[/JAPI] laden und dann mit [JAPI]getSubimage(int x, int y, int w, int h)/JAPI] ein Teilbild heraus schneiden und diese Teilbild im [JAPI]JPanel[/JAPI] Anzeigen.

Problematisch wird es nur, wenn das Bild zu groß für den Speicher ist. Eine Bibliothek um von vornherein nur Teile eines Bildes zu laden kenne ich nicht. Möglich ist es aber auf jeden Fall. Man muss nur das entsprechende Dateiformat (zur Not selbst implementiert) lesen können.
 

LukLuk

Aktives Mitglied
Danke,
so ich hab noch 2 Fragen.
1. Die Parameter von getSubimage, das sind doch Eckpunkte von dem Viereck das den Bereich
definiert wo das Bild ausgeschnitten wird. Ist dann "int x" Links Oben, "int y" Rechts Oben,
"int w" Links Unten und "int h" Rechts Unten oder ist das anders definiert.

So und die zweite Frage ist wie kann ich das Bild den JPanel anpassen so dass das ganze Bild(oder besser gesagt der Bereich der vom Bild ausgewählt wurde) auf dem JPanel ist?
 

LukLuk

Aktives Mitglied
Wenn ich jetzt das bild ausschneiden will kommt eine java.lang.NullPointerException Fehlermeldung, also irgendwas wurde nicht initalisiert. Ich hab aber keine Ahnung wo der Fehler ist.

Java:
import javax.imageio.ImageIO;

public class Layout extends Panels {
	private Panels[] felder;
	public JTextField texteingabe;
	public JButton nextRound;
	public JPanel north;
	public Panels zeiger,gras;
	private int i;
	private boolean set;
	private BufferedImage ganzesBild;
	private BufferedImage bild;

	public Layout() {// Default-Konsturktor-Beginn

		Tasteneingebae tEingabe = new Tasteneingebae();// Erstellung des
														// KeyListeners
		setLayout(new GridLayout(10, 10));// Layout wird festgelegt
		felder = new Panels[100];// Felder werden erzeugt
		for (i = 0; i < felder.length; i++) {
			felder[i] = new Panels();
//			felder[i].setLayout(new GridLayout(0,1));
			add(felder[i]);
		}

		for (i = 0; i < felder.length; i++) {
			if (felder[i] == null) {
				System.out.println("null-Fehler " + i);
			}
		}
		
		zeiger=new Panels();
		gras=new Panels();
		
		nextRound=new JButton("Runde Beenden");
		
		texteingabe = new JTextField();// Erstellung der Steuerung
		texteingabe.setBorder(null);
		texteingabe.setFocusable(true);
		texteingabe.addKeyListener(tEingabe);
		felder[99].add(texteingabe);
		
		nextRound = new JButton("Runde Beenden");	//Runde Beenden Button
		
		north=new JPanel();
		north.setLayout(new GridLayout(0,1));
		north.add(nextRound);
		


		try {// Gras-Bild wird geladen
			BufferedImage ganzesBild = ImageIO.read(new File("GesamtBild.png"));
			for (i = 0; i < felder.length; i++) {
				gras.setHintergrund(ganzesBild.getSubimage(0, 0, 100, 100));
//				felder[i].setHintergrund(ganzesBild.getSubimage(0, 0, 100, 100));
				bild =ganzesBild;
			}
			gras.setHintergrund(ganzesBild.getSubimage(0, 0, 100, 100));
		} catch (IOException e) {
			System.err.println("Fehler beim Laden");
		}
 
V

vanny

Gast
tjoa, da frag ich doch erstmal, was passiert in der Klasse Panels und warum erbst du in deinem Beispiel davon?

PS: die Fehlermeldung würde evtl auch helfen.
 

LukLuk

Aktives Mitglied
Panles ist einfach eine erweiterte Form von JPanles.

Java:
import java.awt.Graphics;
import java.awt.Image;
import java.awt.image.BufferedImage;

import javax.swing.JPanel;


public class Panels extends JPanel{
	private boolean green;				//ist das Feld grün angemalt?
	private boolean makiertes_feld;		//ist das Feld gerade ausgewählt?
	private Image hintergrundbild;		//Hintergrundsbild für Panels
	private BufferedImage bild,hintergrund;
	
	public boolean isMakiertes_feld() {	
		return makiertes_feld;
	}

	public void setMakiertes_feld(boolean makiertes_feld) {
		this.makiertes_feld = makiertes_feld;
	}

	public boolean isGreen() {
		return green;
	}

	public void setGreen(boolean green) {
		this.green = green;
	}
	
	public Panels(){
		 
	 }
	
	public void setHintergrund(BufferedImage hintergrund){
		this.hintergrund=hintergrund;
		repaint();
	}
	
	 public void setImage(BufferedImage bild){				//Konstruktor fürs HintergrundPanel
		this.bild=bild;
		repaint();
	}
	 public void paintComponent(Graphics g) {		//Nur nutzen wenn Bilder verwendet werden
		 g.drawImage(hintergrund, 0, 0,getWidth(),getHeight(), null); 
     }
}

und non die Fehlermedlung

Exception in thread "main" java.lang.NullPointerException
at Layout.<init>(Layout.java:62)
at Haupt.main(Haupt.java:23)
 
V

vanny

Gast
So, ich hab mir mal deinen code so lala zusammengefrimselt und lediglich den merkwürdig geschriebenen KeyListener auskommentiert, fix ne main geschrieben und das Bild eingesetzt.

Was soll ich sagen, nix mit NPE???:L (es wird zwar auch nichts gezeichnet, aber das war ja auch nicht das Problem hier.)
Liegt also an dem, was du nicht gepostet hast.;) (main, der Listener oder was da sonst noch bei dir existiert)

PS: Layout; is n doofer Klassenname und Panels auch und das erben der Layout von Panels sehr sehr merkwürdig???:L

naja manchmal muss man auch nochmal aufräumen^^

Gruß Vanny
 

LukLuk

Aktives Mitglied
Hm ich hab nur das gepostet weil ich dachte das der Keylistener und so nix mit dem Nullpointer-Fehler zu tun hat aber hier der ganze Code
Java:
import javax.imageio.ImageIO;

public class Layout extends Panels {
	private Panels[] felder;
	public JTextField texteingabe;
	public JButton nextRound;
	public JPanel north;
	public Panels zeiger,gras;
	private int i;
	private boolean set;
	private BufferedImage ganzesBild;
	private BufferedImage bild;

	public Layout() {// Default-Konsturktor-Beginn

		Tasteneingebae tEingabe = new Tasteneingebae();// Erstellung des
														// KeyListeners
		setLayout(new GridLayout(10, 10));// Layout wird festgelegt
		felder = new Panels[100];// Felder werden erzeugt
		for (i = 0; i < felder.length; i++) {
			felder[i] = new Panels();
//			felder[i].setLayout(new GridLayout(0,1));
			add(felder[i]);
		}

		for (i = 0; i < felder.length; i++) {
			if (felder[i] == null) {
				System.out.println("null-Fehler " + i);
			}
		}
		
		zeiger=new Panels();
		gras=new Panels();
		
		nextRound=new JButton("Runde Beenden");
		
		texteingabe = new JTextField();// Erstellung der Steuerung
		texteingabe.setBorder(null);
		texteingabe.setFocusable(true);
		texteingabe.addKeyListener(tEingabe);
		felder[99].add(texteingabe);
		
		nextRound = new JButton("Runde Beenden");	//Runde Beenden Button
		
		north=new JPanel();
		north.setLayout(new GridLayout(0,1));
		north.add(nextRound);
		
//		gras.setLayout(new GridLayout(0,1));


		try {// Gras-Bild wird geladen
			BufferedImage ganzesBild = ImageIO.read(new File("GesamtBild.png"));
			for (i = 0; i < felder.length; i++) {
				gras.setHintergrund(ganzesBild.getSubimage(0, 0, 100, 100));
				felder[i].setHintergrund(ganzesBild.getSubimage(0, 0, 100, 100));
				bild =ganzesBild;
			}
			gras.setHintergrund(ganzesBild.getSubimage(0, 0, 100, 100));
		} catch (IOException e) {
			System.err.println("Fehler beim Laden");
		}
		try {// Zeiger-Bild wird geladen
			BufferedImage ganzesBild = ImageIO.read(new File("Zeiger.png"));
			zeiger.setHintergrund(ganzesBild);
		} catch (IOException e) {
			System.err.println("Fehler beim Laden");
		}
		// felder[99].setImage(ganzesBild.getSubimage(50, 100, 200, 400));
	}

	// --------------Defautlt-Konsturktor Ende------------------------------
	// --------------------------------------------------------------------------

	public void farbwechsel(int feld) { // Bestimmt das Feld wo der Zeiger ist
		felder[feld].setMakiertes_feld(true);
		felder[feld].setLayout(new GridLayout(0,1));
		felder[feld].add(zeiger);
		
		
	}

	public int feldbestimmung() { // Bestimmt wo der zeiger gerade ist
		for (int i = 0; i < 100; i++) {
			if (felder[i].isMakiertes_feld() == true) {
				return i;
			}
		}
		return -1;
	}

	public void aktualisierung() { // Aktualisiert das Fenster
		for (i = 0; i < felder.length; i++) {
			if (felder[i].isMakiertes_feld() == true) {
				felder[i].add(zeiger);
			} else {
				felder[i].remove(zeiger);
			}
			if (felder[i].isGreen() == true) {
				if (felder[i].isGreen() == true
						&& felder[i].isMakiertes_feld() == true) {
					felder[i].setHintergrund(bild);
					felder[i].add(zeiger);
				} else {
					felder[i].setBackground(Color.green);
				}
			} else {
				if (felder[i].isMakiertes_feld() != true) {
					setImage(null);
					;
				}
			}
		}
	}

	public void moveLinks(int posi) { // Feld nach Links bewegen
		if ((posi - 1) != -1 && (posi - 1) % 10 != 9) {
			felder[posi].setMakiertes_feld(false);
			felder[posi - 1].setMakiertes_feld(true);
		}
		aktualisierung();
	}

	public void moveRechts(int posi) { // Feld nach Rechts bewegen
		if ((posi + 1) % 10 != 0) {
			felder[posi].setMakiertes_feld(false);
			felder[posi + 1].setMakiertes_feld(true);
		}
		aktualisierung();
	}

	public void moveUnten(int posi) { // Feld nach Unten bewegen
		if ((posi + 10) < 100) {
			felder[posi].setMakiertes_feld(false);
			felder[posi + 10].setMakiertes_feld(true);
		}
		aktualisierung();
	}

	public void moveOben(int posi) { // Feld nach oben bewegen
		if ((posi - 10) > -1) {
			felder[posi].setMakiertes_feld(false);
			felder[posi - 10].setMakiertes_feld(true);
		}
		aktualisierung();
	}

	public void setGruen(int posi) { // Feld grün Färben
		felder[posi].setGreen(true);
	}

	public void resetGruen(int posi) {// Feld wird wieder normal
		felder[posi].setGreen(false);
		aktualisierung();
	}

	public class Tasteneingebae implements KeyListener { // Abfangen der
															// Tasteneingaben
		private int feldposition = 0;
		

		@Override
		public void keyPressed(KeyEvent e) {// Wird ausgeführt, wenn eine Taste
											// gedrückt wurde.
			feldposition = feldbestimmung(); // Blaues-Feld wird bestimmt
			texteingabe.setText("");

			if (e.getKeyChar() == 'a') { // Blaues-Feld wird nach Links bewegt
				moveLinks(feldposition);
			}
			if (e.getKeyChar() == 'd') { // Blaues-Feld wird nach Rechts bewegt
				moveRechts(feldposition);
			}
			if (e.getKeyChar() == 'w') { // Blaues-Feld wird nach Oben bewegt
				moveOben(feldposition);
			}
			if (e.getKeyChar() == 's') { // Blaues-Feld wird nach Unten bewegt
				moveUnten(feldposition);
			}
			if (e.getKeyChar() == 'g') {
				setGruen(feldposition);
			}
			if (e.getKeyChar() == 'r') {
				resetGruen(feldposition);
			}
		}

		@Override
		public void keyReleased(KeyEvent e) {// Wird ausgeführt, wenn eine Taste
												// losgelassen wurde.
			// TODO Auto-generated method stub

		}

		@Override
		public void keyTyped(KeyEvent e) {// Wird ausgeführt, wenn eine Taste
											// gedrückt und wieder losgelassen
											// wurde.
			// TODO Auto-generated method stub

		}

	}
}

und wegen den namen, ich probier hier nur bisschen rum und wollt nix großes machen also hab ich einfach mal irgendwelche namen verteilt.

und hier noch die haupt klasse wenn du die sehen möchtest

Java:
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.GridLayout;

import javax.swing.JFrame;
import javax.swing.JPanel;



public class Haupt {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		JFrame mainWindow=new JFrame();
		JPanel center=new JPanel();
		Container contentPain = mainWindow.getContentPane();
		mainWindow.setSize(500, 500);
		mainWindow.setDefaultCloseOperation(mainWindow.EXIT_ON_CLOSE);
		mainWindow.setResizable(false);
		
		Layout layout=new Layout();
//		contentPain.add(layout.north,BorderLayout.NORTH);
		contentPain.add(layout,BorderLayout.CENTER);
		layout.farbwechsel(44);
		mainWindow.setVisible(true);
		

		
		
	}
	
	

}
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
Athro-Hiro Weißes Bild in Java erstellen Java Basics - Anfänger-Themen 3
V Bild per Java Script austauschen Java Basics - Anfänger-Themen 7
I Bild richtig speichern / Hochkant im File Explorer, nach Upload vertikal Java Basics - Anfänger-Themen 9
B Bild per KeyListener drehen Java Basics - Anfänger-Themen 1
I Kamera anschließen / Bild machen / Live View / Externe Blitz Java Basics - Anfänger-Themen 19
I Innerhalb einem Bild ein Teil austauschen Java Basics - Anfänger-Themen 26
I Datei (Bild) Drucken und wie Druckeinstellung speichern? Java Basics - Anfänger-Themen 3
krgewb byte-Array, das ein Bild repräsentiert Java Basics - Anfänger-Themen 1
H Artefact mit Bild erzeugen Java Basics - Anfänger-Themen 11
R UML-Bild (Erkennung ob static o. nicht) Java Basics - Anfänger-Themen 18
J Bild auf Hintergrundbild zeichnen Java Basics - Anfänger-Themen 5
krgewb Bild itextpdf Java Basics - Anfänger-Themen 2
C Bild in executable JAR File mitgeben Java Basics - Anfänger-Themen 5
VPChief Bild in JEditorPane Java Basics - Anfänger-Themen 9
B Warum bekomme ich kein Bild. Java Basics - Anfänger-Themen 10
S Bild einfügen // NEU Java Basics - Anfänger-Themen 12
N Bild drehen Java Basics - Anfänger-Themen 3
S Ein Bild mit dynamischer Quelle neuzeichnen Java Basics - Anfänger-Themen 12
N GLOOP Bild nicht ansichtbar Java Basics - Anfänger-Themen 5
M Bild in JFrame Java Basics - Anfänger-Themen 1
B Signatur erstellen - Bild ist nur weiß Java Basics - Anfänger-Themen 0
CptK Interface Bild rotieren Java Basics - Anfänger-Themen 17
CptK Interface Bild rotieren Java Basics - Anfänger-Themen 1
Anica Processing Animation Bild-Position ändern Java Basics - Anfänger-Themen 9
CptK Interface Bild über Methode ändern funktioniert nicht Java Basics - Anfänger-Themen 4
CptK Interface Curser durch Bild ersetzen & MouseListner Java Basics - Anfänger-Themen 2
M jTextPane Bild anzeigen Java Basics - Anfänger-Themen 6
CptK Bild beim betätigen eines JButtons Java Basics - Anfänger-Themen 6
S Bild über JButton legen Java Basics - Anfänger-Themen 3
B Bild mit Schrift befüllen / Anpassung bei Wortlänge Java Basics - Anfänger-Themen 2
D Google maps bild mit marker versehen Java Basics - Anfänger-Themen 12
D ImageView mit einfarbigem Bild fuellen Java Basics - Anfänger-Themen 3
it_is_all Bild-Pfad wird gefunden, nicht aber Textdatei-Pfad Java Basics - Anfänger-Themen 8
M Einzelne Pixel in einem Bild auslesen und bearbeiten Java Basics - Anfänger-Themen 1
M Bild wird von JFrame nicht geladen Java Basics - Anfänger-Themen 12
J Bild in Button einsetzen Java Basics - Anfänger-Themen 6
S button kommt durch bild Java Basics - Anfänger-Themen 13
M Ein Bild durch Objekterzeugung zeichnen Java Basics - Anfänger-Themen 5
B Greenscreen (grüner Hintergrund ersetzen mit Bild) Java Basics - Anfänger-Themen 49
K Interface Kein Bild im .jar-File Java Basics - Anfänger-Themen 15
S Bild in Jar-File mit ImageIO Java Basics - Anfänger-Themen 50
S Bild einfügen Java Basics - Anfänger-Themen 16
binop Bild anzeigen lassen Java Basics - Anfänger-Themen 2
D Bild zu Text Java Basics - Anfänger-Themen 4
I HTML Code in Bild (transparent) konvertieren Java Basics - Anfänger-Themen 0
I Watermark erstellen mit HTML in Bild? Java Basics - Anfänger-Themen 7
D Classpath Bild kann in .jar nicht geladen werden Java Basics - Anfänger-Themen 2
Anfänger2011 Bild programmieren?! Java Basics - Anfänger-Themen 3
8 Eigenes Bild in email einfügen Java Basics - Anfänger-Themen 1
K JTable Bild einfügen Java Basics - Anfänger-Themen 1
L BufferdImage schwarzes Bild nach zusammenfügen zweier Bilder Java Basics - Anfänger-Themen 8
S Bild in JOptionPane Java Basics - Anfänger-Themen 1
C Abfrage nach einem Bild im Array Java Basics - Anfänger-Themen 9
J Umgebungsvariable Programmfenster zeigt kein Bild an Java Basics - Anfänger-Themen 1
J Bild loopen Java Basics - Anfänger-Themen 6
M JFrame Bild einfügen Java Basics - Anfänger-Themen 3
S Bild bei Kontakt ändern Java Basics - Anfänger-Themen 2
C Erste Schritte Bild holen und speichern Java Basics - Anfänger-Themen 1
D Bild in Frame einfügen Java Basics - Anfänger-Themen 11
D Bild im Applet anzeigen Java Basics - Anfänger-Themen 3
F Bild in ein Runnable Jar File packen (eclipse) Java Basics - Anfänger-Themen 2
M Java-Applet: Bild einbinden (getImage) Java Basics - Anfänger-Themen 0
J Ganzes Bild Java Basics - Anfänger-Themen 4
T GUI anstatt Bild schwarzes Rechteck gespeichert Java Basics - Anfänger-Themen 0
A Bild verschwindet! Wieso?? Java Basics - Anfänger-Themen 2
I Bild aus Bereich laden Java Basics - Anfänger-Themen 3
P Bild in JFrame Titelleiste Java Basics - Anfänger-Themen 7
Y Nach Bild-Upload wird Bild nicht angezeigt Java Basics - Anfänger-Themen 1
M Button mit Bild und Text Java Basics - Anfänger-Themen 2
M JSP-Einfaches Bild anzeigen Java Basics - Anfänger-Themen 4
C Bild ins Frame laden und Objekte drüber legen Java Basics - Anfänger-Themen 1
Sogomn Bild will sich nicht skalieren lassen Java Basics - Anfänger-Themen 1
P Ein Bild für GUI (Java-Editor) Java Basics - Anfänger-Themen 4
D Bild für ein paar Sekunden einblenden und wieder ausblenden Java Basics - Anfänger-Themen 1
E Bild per Verzeichnis/JFileChooser auf JPanel laden Java Basics - Anfänger-Themen 13
S Bild auf eine Position rotieren?! Java Basics - Anfänger-Themen 4
P Bild bearbeiten Java Basics - Anfänger-Themen 9
Z Datenmatrix in Bild verwandeln Java Basics - Anfänger-Themen 4
C Bild verschwinden lassen Java Basics - Anfänger-Themen 7
S Bild Icon aus ID3Tag auslesen Java Basics - Anfänger-Themen 4
E Bild vom FileChooser aus via ImageIcon in DB schreiben Java Basics - Anfänger-Themen 16
D Bild zum Panel hinzufügen Java Basics - Anfänger-Themen 8
C Greenfoot: Bei Tastendruck und best. Wert Bild ändern Java Basics - Anfänger-Themen 2
O Auflösung einer Bild-Datei bekommen ohne sie herunterzuladen?? Java Basics - Anfänger-Themen 7
O DeviantArt-Bild Konverter: Fehler.. Java Basics - Anfänger-Themen 16
K Transparents Bild laden -> Fehlermeldung Java Basics - Anfänger-Themen 6
M Bild einbinden Java Basics - Anfänger-Themen 7
2 Bild auf JApplet zeichnen Java Basics - Anfänger-Themen 18
T Bild laden Java Basics - Anfänger-Themen 7
R Bild in GUI Java Basics - Anfänger-Themen 11
D Eclipse Juno zeigt Bild nicht bei Run Java Basics - Anfänger-Themen 3
Kenan89 Bild mit jar öffnen Java Basics - Anfänger-Themen 4
S Problem bei Bewegung von einem Bild! Java Basics - Anfänger-Themen 2
J Bild mit transparenter Farbe Java Basics - Anfänger-Themen 10
N Erste Schritte Applet zeichnet Bild nicht Java Basics - Anfänger-Themen 10
J Bild auf JLabel wird nicht angezeigt Java Basics - Anfänger-Themen 11
J Bild einfügen Java Basics - Anfänger-Themen 3
T ASCII Art von Bild erstellen. Java Basics - Anfänger-Themen 32
E Bild OS-unabhängig einbinden mit URL Java Basics - Anfänger-Themen 4
A BufferedImage in Android einbinden - Bild spiegeln -wie? Java Basics - Anfänger-Themen 4

Ähnliche Java Themen

Neue Themen


Oben