# problem! bufferedimage speichern.



## randy (24. Jun 2008)

hallo leute, 
ich habe für die uni ein projekt machen müssen und bin so gut wie fertig. ich habe eine java program mit gui zur bearbeitung von bildern gebastelt. man kann die bilder laden und auch durch die vorgegebenen filter bearbeiten. allerdings kann ich das bearbeitete bild nicht speichern :-(
hier die beiden quellcodes. bitte um hilfe !
danke und gruß
randy


```
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.MediaTracker;
import java.awt.Toolkit;
import java.awt.geom.AffineTransform;
import java.awt.image.*;

import javax.swing.JPanel;

class BildBearbeitungsPanel extends JPanel 
{
  /**
	 * 
	 */
	private static final long serialVersionUID = 1L;
public void paintComponent(Graphics g) 
{
    super.paintComponent(g);
    if (image != null)
      g.drawImage(image, 0, 0, null);
  }

  public void loadImage(String name) {
    Image loadedImage = Toolkit.getDefaultToolkit().getImage(name);
    MediaTracker tracker = new MediaTracker(this);
    tracker.addImage(loadedImage, 0);
    try {
      tracker.waitForID(0);
    } catch (InterruptedException e) {
    }
    image = new BufferedImage(loadedImage.getWidth(null), loadedImage
        .getHeight(null), BufferedImage.TYPE_INT_RGB);
    Graphics2D g2 = image.createGraphics();
    g2.drawImage(loadedImage, 0, 0, null);

    repaint();
  }

  public void saveImage(String name)
  {
	  Image savedImage = Toolkit.getDefaultToolkit().getImage(name);
	  MediaTracker tracker = new MediaTracker(this);
	  tracker.addImage(savedImage, 0);
	  try 
	  {
		  tracker.waitForID(0);
	  }
	  catch (InterruptedException e)
	  {}
	  image = new BufferedImage(savedImage.getWidth(null), savedImage
			  .getHeight(null), BufferedImage.TYPE_INT_RGB);
	  Graphics2D g2 = image.createGraphics();
	  g2.drawImage(savedImage, 0, 0, null);
		 
	  }
  
  
  private void filter(BufferedImageOp op) {
    BufferedImage filteredImage = new BufferedImage(image.getWidth(), image
        .getHeight(), image.getType());
    op.filter(image, filteredImage);
    image = filteredImage;
    repaint();
  }

  private void convolve(float[] elements) {
    Kernel kernel = new Kernel(3, 3, elements);
    ConvolveOp op = new ConvolveOp(kernel);
    filter(op);
  }

  public void blur() {
    float weight = 1.0f / 9.0f;
    float[] elements = new float[9];
    for (int i = 0; i < 9; i++)
      elements[i] = weight;
    convolve(elements);
  }

  public void sharpen() {
    float[] elements = { 0.0f, -1.0f, 0.0f, -1.0f, 5.f, -1.0f, 0.0f, -1.0f,
        0.0f };
    convolve(elements);
  }

  void edgeDetect() {
    float[] elements = { 0.0f, -1.0f, 0.0f, -1.0f, 4.f, -1.0f, 0.0f, -1.0f,
        0.0f };
    convolve(elements);
  }

  public void brighten() {
    float a = 1.5f;
    float b = -20.0f;
    RescaleOp op = new RescaleOp(a, b, null);
    filter(op);
  }

  void negative() {
    byte negative[] = new byte[256];
    for (int i = 0; i < 256; i++)
      negative[i] = (byte) (255 - i);
    ByteLookupTable table = new ByteLookupTable(0, negative);
    LookupOp op = new LookupOp(table, null);
    filter(op);
  }

  void rotate() {
    AffineTransform transform = AffineTransform.getRotateInstance(Math
        .toRadians(180), image.getWidth() / 2, image.getHeight() / 2);
    AffineTransformOp op = new AffineTransformOp(transform,
        AffineTransformOp.TYPE_BILINEAR);
    filter(op);
  }

  void ueber() {
	  System.out.println("Copyright by Randy D.");
  }
  private BufferedImage image;
}
```


```
import java.awt.*;
import java.awt.event.*;

import java.io.*;

import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;

public class Bildbearbeitung 
{
  public static void main(String[] args) 
  {
    JFrame frame = new BildbearbeitungFrame();
  
    frame.setVisible(true);
  }
}

class BildbearbeitungFrame extends JFrame implements ActionListener 
{
  /**
	 * 
	 */
	private static final long serialVersionUID = 1L;

public BildbearbeitungFrame() 
{
    setTitle("Bildbearbeitung");
    setSize(800, 600);
    addWindowListener(new WindowAdapter() 
    {
      public void windowClosing(WindowEvent e) 
      {
        System.exit(0);
      }
    });

    Container contentPane = getContentPane();
    panel = new BildBearbeitungsPanel();
    contentPane.add(panel, "Center");

    JMenu dateiMenue = new JMenu("Datei");
    oeffnenEintrag = new JMenuItem("Öffnen");
    oeffnenEintrag.setMnemonic('f');//erstelle die Kurzwahl dafuer
    oeffnenEintrag.addActionListener(this);
    dateiMenue.add(oeffnenEintrag);
    
    speichernEintrag = new JMenuItem("Speichern");
    speichernEintrag.setMnemonic('S');
    speichernEintrag.addActionListener(this);
    dateiMenue.add(speichernEintrag);

    dateiMenue.addSeparator(); //eine Linie hinzufuegen
    
    beendenEintrag = new JMenuItem("Beenden");
    beendenEintrag.setMnemonic('B');
    beendenEintrag.addActionListener(this);
    dateiMenue.add(beendenEintrag);

    JMenu bearbMenue = new JMenu("Bearbeiten");
    
    wischenEintrag = new JMenuItem("Verwischen");
    wischenEintrag.addActionListener(this);
    wischenEintrag.setMnemonic('w');
    bearbMenue.add(wischenEintrag);

    schaerfenEintrag = new JMenuItem("Schärfen");
    schaerfenEintrag.setMnemonic('S');
    schaerfenEintrag.addActionListener(this);
    bearbMenue.add(schaerfenEintrag);

    aufhellenEintrag = new JMenuItem("Aufhellen");
    aufhellenEintrag.setMnemonic('h');
    aufhellenEintrag.addActionListener(this);
    bearbMenue.add(aufhellenEintrag);

    kantenEintrag = new JMenuItem("Kantendetektor");
    kantenEintrag.setMnemonic('K');
    kantenEintrag.addActionListener(this);
    bearbMenue.add(kantenEintrag);

    negativEintrag = new JMenuItem("Negativ");
    negativEintrag.setMnemonic('N');
    negativEintrag.addActionListener(this);
    bearbMenue.add(negativEintrag);

    drehenEintrag = new JMenuItem("Umdrehen");
    drehenEintrag.setMnemonic('d');
    drehenEintrag.addActionListener(this);
    bearbMenue.add(drehenEintrag);
    
    JMenu hilfsMenue = new JMenu("Über");
    ueberEintrag = new JMenuItem("Felix Sager & Lars Gärtner");
    ueberEintrag.addActionListener(this);
    hilfsMenue.add(ueberEintrag);

    JMenuBar menuBar = new JMenuBar();
    menuBar.add(dateiMenue);
    menuBar.add(bearbMenue);
    menuBar.add(hilfsMenue);
    setJMenuBar(menuBar);
  }

  public void actionPerformed(ActionEvent evt) {
    Object source = evt.getSource();
    if (source == oeffnenEintrag) {
      JFileChooser chooser = new JFileChooser();
      chooser.setCurrentDirectory(new File("a"));

      chooser.setFileFilter(new javax.swing.filechooser.FileFilter() 
      {
        public boolean accept(File f) {
          String name = f.getName().toLowerCase();
          return name.endsWith(".gif") || name.endsWith(".jpg")
              || name.endsWith(".jpeg") || f.isDirectory();
        }

        public String getDescription() {
          return "Bilddateien";
        }
      });

      int r = chooser.showOpenDialog(this);
      if (r == JFileChooser.APPROVE_OPTION) {
        String name = chooser.getSelectedFile().getAbsolutePath();
        panel.loadImage(name);
      }
    } 
    if (source == speichernEintrag)
    {
    	JFileChooser chooser = new JFileChooser();
    	chooser.setCurrentDirectory(new File("c"));
    	
    	chooser.setFileFilter(new javax.swing.filechooser.FileFilter() {
    	
    		public boolean accept(File f) {
    	          String savename = f.getName().toLowerCase();
    	          return savename.endsWith(".gif") || savename.endsWith(".jpg")
    	              || savename.endsWith(".jpeg") || f.isDirectory();
    		 }

            public String getDescription() {
              return "Bilddateien";
            }
          });

          int r = chooser.showSaveDialog(this);
          if (r == JFileChooser.APPROVE_OPTION) {
        	
            String savename = chooser.getSelectedFile().getAbsolutePath();
            panel.saveImage(savename);
          }
        } 
    
    else if (source == beendenEintrag)
      System.exit(0);
    else if (source == wischenEintrag)
      panel.blur();
    else if (source == schaerfenEintrag)
      panel.sharpen();
    else if (source == aufhellenEintrag)
      panel.brighten();
    else if (source == kantenEintrag)
      panel.edgeDetect();
    else if (source == negativEintrag)
      panel.negative();
    else if (source == drehenEintrag)
      panel.rotate();
  }

  private BildBearbeitungsPanel panel;
  private JMenuItem oeffnenEintrag;
  private JMenuItem speichernEintrag;
  private JMenuItem beendenEintrag;
  private JMenuItem wischenEintrag;
  private JMenuItem schaerfenEintrag;
  private JMenuItem aufhellenEintrag;
  private JMenuItem kantenEintrag;
  private JMenuItem negativEintrag;
  private JMenuItem drehenEintrag;
  private JMenuItem ueberEintrag;

}
```


----------



## Marco13 (24. Jun 2008)

Hab nicht alles gelesen, aber ImageIO taucht nirgendwo auf ... kannst ja mal hier schauen: http://java.sun.com/javase/6/docs/api/javax/imageio/ImageIO.html#write(java.awt.image.RenderedImage,%20java.lang.String,%20java.io.File)


----------



## randymandy (26. Jun 2008)

hmm, 
ich habe die speichermethode nur umgeschrieben. es klappt einfach nicht !
da muss mal ein spezi was zu sagen...


----------



## Maeher (26. Jun 2008)

Was du tust, hab ich nicht verstanden, aber mit Speichern hat es irgendwie nichts zu tun, habe ich das Gefühl...
(Zumindest diese Zeilen hier):



			
				randy hat gesagt.:
			
		

> ```
> public void loadImage(String name) {
> Image loadedImage = Toolkit.getDefaultToolkit().getImage(name);
> MediaTracker tracker = new MediaTracker(this);
> ...


Mir scheint, diese Methoden sind bis auf die Variablennamen identisch. Wenn du schon copy&paste codest, dann bitte wenigstens nochmal überprüfen ob es Sinn ergeben kann...

Versuch's mal damit: ImageIO.write()
(Damit geht es wirklich siehe auch Marco13)


----------



## randy (28. Jun 2008)

boah, danke für eure tipps ! 
aber ich bin irgendwie zu blöde, dass selber zu wuppen. ich bekomme die write-parameter nicht fehlerfrei in den quellcode eingebaut. könnte einer von euch das mal probieren ?
danke und gruß
randy


----------



## Maeher (28. Jun 2008)

randy hat gesagt.:
			
		

> könnte einer von euch das mal probieren ?


Hab ich, es funzt. :bae: 
Ernsthaft: Zeig was du hast, und genügend Leute werden dir sagen was falsch ist.
Wenn du nur einfach wieder irgend etwas zusammenkopierst lernst du nie wirklich programmieren und die Verwendung der API. :meld:


----------



## randymandy (28. Jun 2008)

ich habe doch gesagt, dass ich bei der speichermethode nichts hinbekomme und einfach den loadbefehl umgeschrieben habe...
hilfst du mir jetzt und stellst den laufenden quellcode online oder nicht ?!
danke 
randy


----------



## Marco13 (29. Jun 2008)

Ehrlich gesagt wirkt es sehr suspekt, wenn's bei einem Programm, in dem mal so locker-flockig aus der Hüfte eine Kantenerkennung, bilinear gefiltertes Rotieren verbaut sind, dann am Speichern haken soll. Es legt zumindest den Tipp nahe, das Speichern doch auch so zu lösen, wie die anderen Punkte - also vermutlich(!) durch googlen nach Beispielcodeschnispeln, die man zusammenkopieren kann. Wenn du dich jetzt angegriffen fühlst, steht es dir frei, zu erläutern, was das Problem dabei ist, eine Methode (die schon zwei mal verlinkt wurde) aufzurufen.


----------

