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:
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?
 
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?
 
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!!!
 

Neue Themen


Zurück
Oben