AWT Zurücksetzbutton, wieder auf das original Bild

maschjava

Mitglied
Hallo ihr alle,

ich habe gerade eine Projektaufgabe zu meistern. Diese beinhaltet, das wir ein Bild laden und es durch mehrere Filter jagen. Die Filter sind schon alle soweit am laufen, das Problem liegt nur noch bei dem Wiederherstellbutton, dieser will einfach nicht funktionieren. Ich habe dazu eigene Button entworfen, die funktionieren auch alle. Ich lade eine externe Bilddatei als BufferedImage, und habe noch ein weiteres BufferedImage in meiner Datei. Nun muss ich nur wissen welches davon das original Bild ist und wie ich das dann hervorzaubern kan wenn ich auf den entsprechnenden Button klicke. Habt ihr eine Ahnung wie ich das anstellen kann?

Java:
import javax.swing.*;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import java.awt.*;
import java.awt.image.*;
import java.awt.color.ColorSpace;
import java.awt.event.*;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;

public class BildbearbeitungGUI extends JFrame{
	
	private BufferedImage src = null;
	private BufferedImage dst;
	private ImagePanel panel;
	private Graphics g;
	private JMenuItem load;
	private JMenuItem save;
	private JMenuItem exit;
	private boolean a = false;
    private int brightness = 0;
    private int contrast = 10;
    

  
	
	//ButtonBilder
	protected JLabel hintergrund = new JLabel();
	
	protected ImageIcon a1 = new ImageIcon(BildbearbeitungGUI.class.getResource("ButtonAup.jpg"));
	protected ImageIcon a2 = new ImageIcon(BildbearbeitungGUI.class.getResource("ButtonAdown.jpg"));
	protected ImageIcon b1 = new ImageIcon(BildbearbeitungGUI.class.getResource("ButtonBup.jpg"));
	protected ImageIcon b2 = new ImageIcon(BildbearbeitungGUI.class.getResource("ButtonBdown.jpg"));
	protected ImageIcon c1 = new ImageIcon(BildbearbeitungGUI.class.getResource("ButtonCup.jpg"));
	protected ImageIcon c2 = new ImageIcon(BildbearbeitungGUI.class.getResource("ButtonCdown.jpg"));
	protected ImageIcon d1 = new ImageIcon(BildbearbeitungGUI.class.getResource("ButtonDup.jpg"));
	protected ImageIcon d2 = new ImageIcon(BildbearbeitungGUI.class.getResource("ButtonDdown.jpg"));
	protected ImageIcon e1 = new ImageIcon(BildbearbeitungGUI.class.getResource("ButtonEup.jpg"));
	protected ImageIcon e2 = new ImageIcon(BildbearbeitungGUI.class.getResource("ButtonEdown.jpg"));
	protected ImageIcon f1 = new ImageIcon(BildbearbeitungGUI.class.getResource("ButtonFup.jpg"));
	protected ImageIcon f2 = new ImageIcon(BildbearbeitungGUI.class.getResource("ButtonFdown.jpg"));
	protected ImageIcon reverse1 = new ImageIcon(BildbearbeitungGUI.class.getResource("reverseup.jpg"));
	protected ImageIcon reverse2 = new ImageIcon(BildbearbeitungGUI.class.getResource("reversedown.jpg"));

	//Button Objekte
	private	JButton aa1 = new JButton(a1);
	private	JButton bb1 = new JButton(b1);
	private	JButton cc1 = new JButton(c1);
	private JButton dd1 = new JButton(d1);
	private	JButton ee1 = new JButton(e1);
	private	JButton ff1 = new JButton(f1);
	private JButton rr1 = new JButton(reverse1);

	public BildbearbeitungGUI(){
		
		JMenuBar menuBar = new JMenuBar();
		JMenu datei = new JMenu("Datei");
		LoadSaveListener loadSaveListener = new LoadSaveListener();
		load = new JMenuItem("Öffnen");
		save = new JMenuItem("Speichern");
		exit = new JMenuItem("Beenden");
	
		load.addActionListener(loadSaveListener);
		save.addActionListener(loadSaveListener);
		exit.addActionListener(loadSaveListener);

	    setLayout(new BorderLayout());
   
		menuBar.add(datei);
		datei.add(load);
		datei.add(save);
		datei.add(exit);
		
		//Werkzeugpanel
		JPanel palettePanel = new JPanel();
		palettePanel.setBackground(Color.BLACK);
		add(palettePanel, BorderLayout.SOUTH);
	
		aa1.setBorder(null);
		aa1.setPressedIcon(a2);
		aa1.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e){
				a = true;
				new malen();
			}
		});
		
		bb1.setBorder(null);
		bb1.setPressedIcon(b2);
		bb1.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e){
				a = false;
				grau();
			}
		});
		
		cc1.setBorder(null);
		cc1.setPressedIcon(c2);
		cc1.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e){
				a = false;
				new HelligkeitKontrast();
			
			}
		});
		
		dd1.setBorder(null);
		dd1.setPressedIcon(d2);
		dd1.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e){
				a = false;
				invertImage();
			
			}
		});

		ee1.setBorder(null);
		ee1.setPressedIcon(e2);
		ee1.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e){
				a = false;
				scharf();
			}
		});
		
		ff1.setBorder(null);
		ff1.setPressedIcon(f2);
		ff1.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e){
				a = false;
				weich();
			}
		});
		

		
		rr1.setBorder(null);
		rr1.setPressedIcon(reverse2);
		rr1.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e){
				reverse();
			}
		});
		
		//Buttons sichtbar machen
		palettePanel.add(hintergrund);
		palettePanel.add(aa1);
		palettePanel.add(bb1);
		palettePanel.add(cc1);
		palettePanel.add(dd1);
		palettePanel.add(ee1);
		palettePanel.add(ff1);
		palettePanel.add(rr1);
	
		
		src = new BufferedImage(400, 400, BufferedImage.TYPE_INT_RGB);
		
		panel = new ImagePanel(/*src*/);
		panel.addMouseMotionListener(new malen());
		
		setJMenuBar(menuBar);
		add(panel);
	}
	
	//Main Methode
	public static void main(String[] arg){
		BildbearbeitungGUI frame = new BildbearbeitungGUI();
		frame.pack();
		frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
		frame.setVisible(true);
	}

	

	//Funktion zum Zeichnen (ButtonA)
	private class malen implements MouseMotionListener{
		public void mouseDragged(MouseEvent e){
			if (a == true){
				g.setColor(Color.BLACK);
			
			g.fillOval(e.getX(), e.getY(),6,6);
				processImage();
			
			}
		}
		public void mouseMoved(MouseEvent e){}
	
	}
	
	public void grau(){
			ColorConvertOp grayScaleConversionOp = new ColorConvertOp(ColorSpace
	                .getInstance(ColorSpace.CS_GRAY), null);

	        grayScaleConversionOp.filter(src, dst);
			g.drawImage(dst, 0, 0, null);
			processImage();
		}
	
	public void reverse() {
		
//		dst = new BufferedImage(src.getWidth(), src.getHeight(), BufferedImage.TYPE_INT_RGB);
//		panel.repaint();
		
//		dst = new BufferedImage(src.getWidth(null), src.getHeight(null),
//		        BufferedImage.TYPE_INT_RGB);
	//	g.drawImage(src, 0, 0, null);
//		g = src.getGraphics();
//		processImage();
		//panel.repaint();
	}
	

	public class ImagePanel extends JPanel{
		
		public ImagePanel(){}
		
		 public void paintComponent(Graphics g){
	           if(dst != null){
	           g.drawImage(dst, 0, 0, dst.getWidth(), dst.getHeight(), null);
	           }
	     }
		
		public Dimension getPreferredSize(){
			return new Dimension(src.getWidth(), src.getHeight());
		}
	}

	//Laden, Speichern, Beenden
	private class LoadSaveListener implements ActionListener{
		public void actionPerformed(ActionEvent e){
			JFileChooser fileChooser = new JFileChooser();
			if(e.getSource() == load){
				int state = fileChooser.showOpenDialog(null);
				fileChooser.setName("Datei öffnen");
				if(state == JFileChooser.APPROVE_OPTION){
					File file = fileChooser.getSelectedFile();
					try{
						BufferedImage loadImg = ImageIO.read(file);
						setTitle(file.getName());
		                src = new BufferedImage(loadImg.getWidth(), loadImg.getHeight(), BufferedImage.TYPE_INT_RGB);
		                g = src.getGraphics();
		                g.drawImage(loadImg, 0, 0, null);
						setSize(loadImg.getWidth(), loadImg.getHeight()+(97));
					}
					catch(IOException ioE){
						System.out.println(ioE.getMessage());
					}
				}
				processImage();
			
			}
			if(e.getSource() == save){
				int state = fileChooser.showSaveDialog(null);
				fileChooser.setName("Datei Speichern");
				if(state == JFileChooser.APPROVE_OPTION){
					File file = fileChooser.getSelectedFile();
					try{
						BufferedImage toSave = new BufferedImage(dst.getWidth(), dst.getHeight(), BufferedImage.TYPE_INT_RGB);
						Graphics saveG = toSave.getGraphics();
						saveG.drawImage(dst, 0, 0, null);
						ImageIO.write(toSave, "jpeg", file);
					}
					catch(IOException ioE){
						System.out.println(ioE.getMessage());
					}
				}
			}
			if(e.getSource() == exit){
					System.exit(0);
				}
			}
		}
	
	//Negativ erstellen Button D
		
	public void invertImage ()
	{ 

	  BufferedImage dst= new BufferedImage(src.getWidth(), src.getHeight(), BufferedImage.TYPE_INT_RGB); 
	  { 
	   int width = src.getWidth(); 
	   int height = src.getHeight(); 
	   for (int x = 0 ; x < width ; x++) 
	   { 
	     for (int y = 0 ; y < height ; y++) 
	     { 
	       int rgbValue = src.getRGB(x, y); 
	       Color color = new Color(rgbValue); 
	       int red = 255 - color.getRed(); 
	       int green = 255 - color.getGreen(); 
	       int blue = 255 - color.getBlue(); 
	       color = new Color (red, green, blue); 
	       dst.setRGB(x,y,color.getRGB()); 
	     } 
	   } 
	   g.drawImage(dst,0,0,null);
	   processImage();
	  } 
	}
	
	public void weich()
	{
			float[] w = {0.1f,  0.2f,  0.1f,
				    0.2f,  0.0f,  0.2f,
				    0.1f,  0.2f,  0.1f};
			BufferedImageOp weichFilter = new ConvolveOp(new Kernel(3,3, w), ConvolveOp.EDGE_NO_OP, null);
	        weichFilter.filter(src, dst);
			g.drawImage(dst, 0, 0, null);
			processImage();
	}
	
	public void scharf()
	{
			float[] w = {0.f, -1.f, 0.f,
                    -1.f, 5.f, -1.f,
                    0.f, -1.f, 0.f};
			BufferedImageOp weichFilter = new ConvolveOp(new Kernel(3,3, w), ConvolveOp.EDGE_NO_OP, null);
	        weichFilter.filter(src, dst);
			g.drawImage(dst, 0, 0, null);
			processImage();
	}
	
	
	//Klasse für Helligkeit und Kontrast
	private class HelligkeitKontrast extends JFrame{
		
		private JSlider brightSlide;
	    private JSlider contrastSlide;
	    private JPanel sliders;

		
	    public HelligkeitKontrast(){
	    sliders = new slidePanel();
	    
	    add(sliders);
	    pack();
	    setVisible(true);
	    }
	 class slidePanel extends JPanel{
        public slidePanel(){
            brightSlide = new JSlider(-255,255,brightness);
            contrastSlide = new JSlider(-30,30,contrast);
            brightSlide.addChangeListener(new slideListener());
            
            contrastSlide.addChangeListener(new slideListener());
            
            JLabel brightLab = new JLabel("Helligkeit: ");
            JLabel contLab = new JLabel("Kontrast: ");

            Box brightBox = Box.createHorizontalBox();
            Box contrastBox = Box.createHorizontalBox();
            setLayout(new BorderLayout());
            brightBox.add(brightLab);
            brightBox.add(brightSlide);
            contrastBox.add(contLab);
            contrastBox.add(contrastSlide);
            add(brightBox, BorderLayout.NORTH);
            add(contrastBox, BorderLayout.SOUTH);
        }
    }
	class slideListener implements ChangeListener{

        public void stateChanged(ChangeEvent e) {
            if(e.getSource() == contrastSlide){
                contrast = contrastSlide.getValue();
            }
            if(e.getSource() == brightSlide){
               brightness = brightSlide.getValue();
            }
            processImage();
            
        }
    }
	
	


	}
    private void processImage(){
        //Helligkeit erhöhen
        float cont = (float)contrast / 10;
        BufferedImageOp op = new RescaleOp(cont, brightness, null);
        dst = op.filter(src, null);
        panel.repaint();
    }
}
 
Zuletzt bearbeitet:

SuperSeppel13

Bekanntes Mitglied
1) Warum schreibst du in Zeile 243 (beim Laden des Bildes) nicht einfach "src = ImageIO.read(file);" statt der umständlichen Übertragung?

2) src wird doch (wenn ich das richtig gesehen habe) nie geändert. Müsstest du dann zum "Wiederherstellen" nicht bloß src neu zeichnen. Oder liege ich falsch in der Annahme, dass der "Wiederherstellen"-Button das Originalbild auf den Bildschirm zaubern soll?
 

maschjava

Mitglied
Also wenn ich loadImg ganz raus nehme, statt dessen überall src einbinde, bekomme ich beim Laden eines Bildes kein Bild sondern nur schwarz. Kann es denn nicht auch an der reverse() Methode liegen, das die Variablen/Objekte falsch angeordnet sind?
 

maschjava

Mitglied
So ich wir haben das Problem jetzt gelöst. Ganz großen Dank an deinen Tipp.

Also, wir haben jetzt eine Instanzvariable von loadImg instanziaiert, als BufferedImage. Die wird dann in der reverse() Methode wieder aufgegriffen.

So sehen jetzt die entsprechenden Stellen im Code aus:
Variablen:
Java:
public class BildbearbeitungGUI extends JFrame{
	
	private BufferedImage src = null;
	private BufferedImage dst;
	private BufferedImage loadImg;

Die revsers():
Java:
	public void reverse() {
		
				Graphics f = dst.getGraphics();

				f.drawImage(loadImg,0,0,loadImg.getWidth(), loadImg.getHeight(),null);

				panel.repaint();
				g.drawImage(dst, 0, 0, dst.getWidth(), dst.getHeight(), null);


	}

Und beim Laden so:
Java:
				if(state == JFileChooser.APPROVE_OPTION){
					File file = fileChooser.getSelectedFile();
					try{
						loadImg = ImageIO.read(file);
						setTitle(file.getName());
		                src = new BufferedImage(loadImg.getWidth(), loadImg.getHeight(), BufferedImage.TYPE_INT_RGB);
		                g = src.getGraphics();
		                g.drawImage(loadImg, 0, 0, null);
						setSize(loadImg.getWidth(), loadImg.getHeight()+(97));
					}
					catch(IOException ioE){
						System.out.println(ioE.getMessage());
					}
				}

Jetzt wird immer das Originalbild geladen, egal wieviele Filter angewendet werden.

Danke, danke!!!
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
richis-fragen Wie kann man den RowSorter dazu bringen die ursprünglich liste wieder anzuzeigen. AWT, Swing, JavaFX & SWT 28
J Eingaben aus Textfield & ComboBox speichern und in ComboBox wieder ausgeben AWT, Swing, JavaFX & SWT 3
B Text mit Absatz + OK-Button, der Fenster wieder schließt AWT, Swing, JavaFX & SWT 7
J JOptionPane ruft sich selbst immer wieder neu auf AWT, Swing, JavaFX & SWT 3
R JOptionPane schließt sich nicht wieder AWT, Swing, JavaFX & SWT 2
S Swing Mal wieder JTable Ansicht aktualisieren AWT, Swing, JavaFX & SWT 10
C Memory Karten nach Paar offen bleiben sonst wieder umdrehen AWT, Swing, JavaFX & SWT 1
C Benutzername in GUI eingeben und nach Spiel neues Fenster Benutzername wieder anzeigen AWT, Swing, JavaFX & SWT 1
T SWT Mysql Tabelle zeigt immer nur den ersten Wert immer wieder an AWT, Swing, JavaFX & SWT 3
X AWT Text der mit Graphics "drawString(...)" geschreiben wurde wieder löschen. AWT, Swing, JavaFX & SWT 6
F Swing Java Swing Array in Datei und wieder raus AWT, Swing, JavaFX & SWT 7
A Swing Paint mit Button Clear den Hintergrund säubern um wieder zeichnen zu können AWT, Swing, JavaFX & SWT 2
M Java anwendung VOR vollbildspielen (schon wieder...) AWT, Swing, JavaFX & SWT 5
P jframe setVisible(false) wieder sichtbar machen? AWT, Swing, JavaFX & SWT 4
B Swing Repaint Problem - mal wieder AWT, Swing, JavaFX & SWT 5
A jformattedtextfield unsichtbar und wieder sichtbar machen AWT, Swing, JavaFX & SWT 13
J Swing Fenster lässt sich nach Schließung nicht wieder öffnen AWT, Swing, JavaFX & SWT 4
O JTable zeigt die alte Daten wieder AWT, Swing, JavaFX & SWT 23
A AWT Nach dem generieren von bildern verschwinden diese wieder AWT, Swing, JavaFX & SWT 9
J Mal wieder Probleme mit paintComponent AWT, Swing, JavaFX & SWT 3
C SWT CTabItem wieder sichtbar machen AWT, Swing, JavaFX & SWT 3
C Schon wieder JTable AWT, Swing, JavaFX & SWT 7
GUI-Programmer Wieder ne Layout Frage AWT, Swing, JavaFX & SWT 11
R Komponente wieder entfernen AWT, Swing, JavaFX & SWT 13
E wieder einmal JTable AWT, Swing, JavaFX & SWT 5
A Fokus wieder in ein JTextField setzen AWT, Swing, JavaFX & SWT 4
L Buttons aus Arrayliste erstellt wie komm ich nun wieder an das Oobjekt aus der arrayliste ran AWT, Swing, JavaFX & SWT 3
Z Swing Buttons wieder entfernen vom Bildschirm AWT, Swing, JavaFX & SWT 5
O Swing JButton werden richtig gewechselt aber die Maus macht die alten wieder Sichtbar?? AWT, Swing, JavaFX & SWT 5
N gezeichnete Graphiken speichern und wieder anzeigen AWT, Swing, JavaFX & SWT 8
hdi SWT Operation auf GUI-Komponente kommt mal wieder nicht an... AWT, Swing, JavaFX & SWT 9
Ollek Swing JPnales nach bestimmtenVorgang wieder anzeigen AWT, Swing, JavaFX & SWT 4
P Swing Hintergrundfarbe auslesen und wieder setzen AWT, Swing, JavaFX & SWT 4
S ProgressBar newRunnable (schon wieder!) AWT, Swing, JavaFX & SWT 9
M Fenster nach minimierung zum tray wieder öffnen AWT, Swing, JavaFX & SWT 3
E Swing Wieder ein Bild einfügen AWT, Swing, JavaFX & SWT 2
P schon wieder schlange AWT, Swing, JavaFX & SWT 8
Luy Per TAB-Taste aus TextArea wieder raus? AWT, Swing, JavaFX & SWT 5
D Swing JMenu wieder schließen lassen AWT, Swing, JavaFX & SWT 7
F JFileChooser mal wieder AWT, Swing, JavaFX & SWT 2
B Wie kann ich ein event wieder beseitigen AWT, Swing, JavaFX & SWT 2
hdi Swing mal wieder EDT -> nichts passiert AWT, Swing, JavaFX & SWT 20
S Feintuning, mal wieder Threading + swing ... AWT, Swing, JavaFX & SWT 8
P JTable...mal wieder AWT, Swing, JavaFX & SWT 7
S JDialog startet immer wieder neu AWT, Swing, JavaFX & SWT 2
A Wie werde ich beim JTable die Selection wieder los? AWT, Swing, JavaFX & SWT 6
PAX Iconified JFrame per Code wieder anzeigen lassen (deiconify) AWT, Swing, JavaFX & SWT 2
T Mal wieder Swing GUI AWT, Swing, JavaFX & SWT 7
hdi repaint() mag mal wieder nicht. AWT, Swing, JavaFX & SWT 9
T JCheckBox deselektieren (Haken wieder entfernen) - wie? AWT, Swing, JavaFX & SWT 5
M ich will die alten "alte JButtons"wieder haben AWT, Swing, JavaFX & SWT 6
G Ein jTextField im laufe das Programmes immer wieder updaten AWT, Swing, JavaFX & SWT 2
G wieder mal das leidige thema listener AWT, Swing, JavaFX & SWT 3
G Drag and Drop mal wieder? AWT, Swing, JavaFX & SWT 2
C JTable. Mal wieder AWT, Swing, JavaFX & SWT 10
T Ich komme mal wieder nicht mit Swing und Image klar. AWT, Swing, JavaFX & SWT 5
G SWT Toolbar: Toolitem entfernen und wieder hinzufügen AWT, Swing, JavaFX & SWT 16
M wieder einmal JScrollPane und JList AWT, Swing, JavaFX & SWT 4
S getSize gibt keine Größe wieder AWT, Swing, JavaFX & SWT 4
T Linien zeichnen und wieder löschen AWT, Swing, JavaFX & SWT 9
Z Und schon wieder die Linien (Problem beim überzeichnen) AWT, Swing, JavaFX & SWT 4
V mal wieder das gute alte gridbaglayout AWT, Swing, JavaFX & SWT 4
W JTabele Aktualisieren - Wieder einmal AWT, Swing, JavaFX & SWT 4
B Schon wieder ein Problem mit paintComponent(). AWT, Swing, JavaFX & SWT 2
S JScrollPane mal wieder AWT, Swing, JavaFX & SWT 2
R JLabel Icon wieder entfernen AWT, Swing, JavaFX & SWT 4
A Wieder einmal Event-Dispatch-Thread AWT, Swing, JavaFX & SWT 5
R Mal wieder JTable AWT, Swing, JavaFX & SWT 11
I JProgressBar String anzeigen, danach wieder normale Ansicht AWT, Swing, JavaFX & SWT 3
G mal wieder table. AWT, Swing, JavaFX & SWT 3
X wieder mal ein prob mit dnd AWT, Swing, JavaFX & SWT 14
Luma Alle Fenster verstecken und wieder sichtbar machen? AWT, Swing, JavaFX & SWT 6
S JFrame minimieren und wieder herstellen AWT, Swing, JavaFX & SWT 2
J Spalte in JTable aus- und wieder einblenden AWT, Swing, JavaFX & SWT 10
R Anonymen CaretListener wieder entfernen AWT, Swing, JavaFX & SWT 4
G JTabbedPane: Tabs verschwinden lassen und wieder anzeigen AWT, Swing, JavaFX & SWT 3
G TableModel von JTable wieder entfernen AWT, Swing, JavaFX & SWT 10
juppi JFrame will nicht wieder verschwinden AWT, Swing, JavaFX & SWT 2
K Und schon wieder JInternalFrame AWT, Swing, JavaFX & SWT 2
S Wieder eine Frage zu javax.swing.text AWT, Swing, JavaFX & SWT 2
G Original JFC Tutorial Demo DragListDemo hat einen Bug! AWT, Swing, JavaFX & SWT 4

Ähnliche Java Themen


Oben