Guten Morgen,
ich habe ein kleines Grafikprogramm, damit kann ich Bilder über einen JFileChooser öffnen, über das JMenu "Bearbeiten" kann ich das Bild Drehen und die Helligkeit verändern.
Ich kann diese Veränderungen auch abspeichern, allerdings mit der Beschränkung, das nur eines von beiden geht, also wenn ich es Drehe dann und dann die Helligkeit setze, springt das Bild auf die Urspungsposition zurück. Bei Helligkeit ist es genau dasselbe nur umgekehrt.
Ich würde aber nun gerne beides, das Bild Drehen, und am gedrehten Bild die Helligkeit ändern und speichern.
Wäre schön wenn mir jemand helfen könnte.
ich habe ein kleines Grafikprogramm, damit kann ich Bilder über einen JFileChooser öffnen, über das JMenu "Bearbeiten" kann ich das Bild Drehen und die Helligkeit verändern.
Ich kann diese Veränderungen auch abspeichern, allerdings mit der Beschränkung, das nur eines von beiden geht, also wenn ich es Drehe dann und dann die Helligkeit setze, springt das Bild auf die Urspungsposition zurück. Bei Helligkeit ist es genau dasselbe nur umgekehrt.
Ich würde aber nun gerne beides, das Bild Drehen, und am gedrehten Bild die Helligkeit ändern und speichern.
Wäre schön wenn mir jemand helfen könnte.
Code:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GridLayout;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.geom.AffineTransform;
import java.awt.geom.Point2D;
import java.awt.image.AffineTransformOp;
import java.awt.image.BufferedImage;
import java.awt.image.BufferedImageOp;
import java.awt.image.ColorConvertOp;
import java.awt.image.RescaleOp;
import java.io.File;
import java.io.IOException;
import javax.swing.*;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import javax.imageio.ImageIO;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JSlider;
import javax.swing.JTextField;
import javax.swing.WindowConstants;
import javax.swing.filechooser.FileNameExtensionFilter;
public class Grafikprogramm extends JFrame {
private JMenuItem opennow;
private JMenuItem close;
private JMenuItem save;
private JMenuItem quit;
private JFileChooser fileChooser;
private JMenuItem helligkeit;
private JMenuItem rotieren;
private JMenu menuBearbeiten;
private JFrame f = new JFrame("Test");
private File datei;
private BufferedImage image;
private BufferedImage originalImage;
private JPanel unten;
ViewComponent view = new ViewComponent(); // Ebene auf der das BIld liegt
private JSlider slider;
private JSlider slider1;
private JSlider slider2;
private int centerX, centerY;
Grafikprogramm() {
super();
Container content = getContentPane();
this.setTitle("Bildbearbeiter");
// MenuBar mit Tastenkuerzeln
JMenuBar menuLeiste = new JMenuBar();
JMenu menuDatei = new JMenu("Datei");
menuDatei.setMnemonic('D');
menuBearbeiten = new JMenu("Bearbeiten");
menuBearbeiten.setMnemonic('B');
JMenu menuHilfe = new JMenu("Hilfe");
menuHilfe.setMnemonic('H');
// Tastenkuerzel und Menu Aktionen
opennow = new JMenuItem("Oeffnen", KeyEvent.VK_O);
close = new JMenuItem("Schliessen", KeyEvent.VK_S);
quit = new JMenuItem("Programm Beenden", KeyEvent.VK_P);
save = new JMenuItem("Speichern", KeyEvent.VK_S);
opennow.addActionListener(new MenueAktion01());
quit.addActionListener(new MenueAktion01());
close.addActionListener(new MenueAktion01());
save.addActionListener(new MenueAktion01());
//Panel für Slider south
unten = new JPanel();
add(unten,BorderLayout.SOUTH);
unten.setLayout(new GridLayout(4,1));
unten.add(slider = new JSlider(1,50,25));
unten.add(slider1 = new JSlider(1,50,25));
unten.add(slider2 = new JSlider(1,50,25));
slider.setVisible(false);
slider1.setVisible(false);
slider2.setVisible(false);
// Dateiauswahl nur fuer jpg und gif
fileChooser = new JFileChooser();
FileNameExtensionFilter filter = new FileNameExtensionFilter("Bildformate gif+jpg", "gif","jpg");
fileChooser.setAcceptAllFileFilterUsed(false);
fileChooser.addChoosableFileFilter(filter);
menuDatei.add(opennow);
menuDatei.add(close);
menuDatei.add(save);
menuDatei.add(quit);
menuLeiste.add(menuDatei);
menuLeiste.add(menuBearbeiten);
menuLeiste.add(menuHilfe);
this.setJMenuBar(menuLeiste);
helligkeit = new JMenuItem("Helligkeit", KeyEvent.VK_H);
rotieren = new JMenuItem ("Drehen",KeyEvent.VK_D);
menuBearbeiten.add(helligkeit);
menuBearbeiten.add(rotieren);
helligkeit.addActionListener(new MenueAktion01());
rotieren.addActionListener(new MenueAktion01());
close.setEnabled(true);
menuBearbeiten.setEnabled(false);
// Flaeche fuer Bild hinzufuegen
add(view);
}
class ViewComponent extends JComponent {
int width,height;
public void setImage(File file) {
try {
image = ImageIO.read(file);
repaint();
width = image.getWidth(null);
height = image.getHeight(null);
originalImage =
new BufferedImage(width, height,
BufferedImage.TYPE_INT_RGB);
Graphics g = originalImage.createGraphics();
g.drawImage(image, 0, 0, null);
g.dispose();
}
catch (IOException e) {
JOptionPane.showMessageDialog(f, e.getMessage(), "Fehler",
JOptionPane.ERROR_MESSAGE);
}
}
// alles was nicht an sein darf wenn kein Bild geladen
public void paint(Graphics g) {
if (image != null) {
// Wenn Bild geladen, erlaube es zu bearbeiten
menuBearbeiten.setEnabled(true);
save.setEnabled(true);
Graphics2D g2d = image.createGraphics();
} else {
g.drawString("Kein Bild geladen", 280, 200);
// slider.setVisible(false);
save.setEnabled(false);
}
g.drawImage(image, 0, 0, null);
}
}
// rotieren methode
public void rotate(double multiple) {
AffineTransformOp op = new AffineTransformOp(
AffineTransform.getRotateInstance(multiple,
centerX,
centerY),
AffineTransformOp.TYPE_BILINEAR);
image = op.filter(originalImage, null);
repaint();
}
// helligkeit methode
public void setBrightnessFactor(float multiple) {
RescaleOp op = new RescaleOp(multiple, 0, null);
image = op.filter(originalImage, null);
repaint();
}
// Aktionen auf Menu Items
class MenueAktion01 implements ActionListener {
int result;
public void actionPerformed(ActionEvent e) {
if (e.getSource() == opennow) {
slider.setVisible(false);
result = fileChooser.showOpenDialog(null);
if (result == fileChooser.APPROVE_OPTION) {
// Datei die ausgewaehlt
datei = fileChooser.getSelectedFile();
System.out.println(fileChooser.getSize());
System.out.println(datei);
if (fileChooser.getWidth() > 100) {
// Wohin die Datei als Image
view.setImage(datei);
opennow.setEnabled(false);
close.setEnabled(true);
}
}
}
// Programmm schliessen
if (e.getSource() == quit) {
System.exit(0);
}
// Bild schliessen
if (e.getSource() == close) {
image = null;
slider.setVisible(false);
menuBearbeiten.setEnabled(false);
opennow.setEnabled(true);
close.setEnabled(false);
save.setEnabled(false);
slider.setVisible(false);
slider1.setVisible(false);
slider2.setVisible(false);
repaint();
}
// Speichern MenuItem
if (e.getSource() == save) {
slider.setVisible(false);
// neuer JFileChooser zum Speichern
JFileChooser fc = new JFileChooser();
int returnVal = fc.showSaveDialog(Grafikprogramm.this);
if (returnVal == JFileChooser.APPROVE_OPTION) {
datei = fc.getSelectedFile();
// Schreiben mit ImageIO
try {
ImageIO.write(image, "jpg", datei);
} catch (IOException e1) {
e1.printStackTrace();
}
}
}
// rotieren
if (e.getSource()== rotieren) {
slider.setVisible(false);
slider1.setVisible(false);
slider2.setVisible(true);
rotate(0);
slider2.addChangeListener(new ChangeListener() {
public void stateChanged(ChangeEvent e) {
centerX = (int)originalImage.getWidth()/2;
centerY = (int)originalImage.getHeight()/2;
rotate((double) (slider2.getValue()- 25.5) /4);
}
});
}
// helligkeit
if (e.getSource() == helligkeit){
slider1.setVisible(true);
slider.setVisible(false);
slider2.setVisible(false);
setBrightnessFactor(1);
slider.setVisible(false);
slider1.setVisible(true);
slider1.addChangeListener(new ChangeListener(){
public void stateChanged(ChangeEvent e){
setBrightnessFactor((float)(slider1.getValue())/25);
}
});
}
}
}
public static void main(String[] args) {
Grafikprogramm main = new Grafikprogramm();
main.setLocation(135, 0);
main.setSize(640, 480);
main.setBackground(Color.WHITE);
main.setVisible(true);
main.setAlwaysOnTop(false);
main.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
}
}