KI_RGBQuant/Window.java

277 lines
8.3 KiB
Java

/**
* BITTE NICHT MEHR NUTZEN -> stattdessen OGL_Window verwenden!
*/
import ChartDirector.*;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.ArrayList;
import java.io.File;
import java.util.Collections;
/**
* Zeigt das Fenster an mit allen Komponenten
*
* @author Alexander Kimmig
* @version 1.0.1
*/
public class Window implements ActionListener
{
private JFrame frame;
private JPanel drawPanel;
private ArrayList<RGB> image;
private ArrayList<RGB> orig;
private ArrayList<RGB> quants;
private int alpha = 25;
private int beta = 45;
private int size;
private boolean colorize;
private JButton vl;
private JButton vr;
private JButton vu;
private JButton vd;
private JButton b_load;
private JButton b_gen;
private JButton b_epoc;
private JButton b_reset;
private JButton b_save;
private JComboBox s_input;
private JTextField t_anz;
private JTextField t_output;
/**
* Konstruktor: legt JFrame und alle Panels/Buttons an
*/
public Window(int size, boolean colorize)
{
this.size = size;
this.colorize = colorize;
frame = new JFrame();
frame.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) { System.exit(0); }
});
JPanel mainPanel = new JPanel();
mainPanel.setLayout(new BoxLayout(mainPanel, BoxLayout.Y_AXIS));
drawPanel = new JPanel();
drawPanel.setPreferredSize(new Dimension(size, size));
drawPanel.setBackground(new Color(0xFFFFFF));
JPanel view = new JPanel();
JPanel steps = new JPanel();
JPanel config = new JPanel();
mainPanel.add(drawPanel);
mainPanel.add(view);
mainPanel.add(steps);
mainPanel.add(config);
vl = new JButton("<");
vl.addActionListener(this);
view.add(vl);
vr = new JButton(">");
vr.addActionListener(this);
view.add(vr);
vu = new JButton("^");
vu.addActionListener(this);
view.add(vu);
vd = new JButton("v");
vd.addActionListener(this);
view.add(vd);
b_load = new JButton("Datei laden");
b_load.addActionListener(this);
steps.add(b_load);
b_gen = new JButton("Zufällige Punkte erzeugen");
b_gen.addActionListener(this);
steps.add(b_gen);
b_epoc = new JButton("Epoche durchspielen");
b_epoc.addActionListener(this);
steps.add(b_epoc);
b_reset = new JButton("Punkte versetzen");
b_reset.addActionListener(this);
steps.add(b_reset);
b_save = new JButton("Datei speichern");
b_save.addActionListener(this);
steps.add(b_save);
config.add(new JLabel("Input:"));
s_input = new JComboBox(getJPGs());
config.add(s_input);
config.add(new JLabel("Anzahl Punkte:"));
t_anz = new JTextField("32");
t_anz.setPreferredSize(new Dimension(100,20));
config.add(t_anz);
config.add(new JLabel("Output:"));
t_output = new JTextField("output.jpg");
t_output.setPreferredSize(new Dimension(100,20));
config.add(t_output);
frame.add(mainPanel);
frame.pack();
frame.setVisible(true);
this.image = new ArrayList<>();
this.quants = new ArrayList<>();
this.plot();
}
/**
* plottet die Punkte in ein 3D-Scatter-Plot und zeigt dieses an
*/
public void plot()
{
ChartViewer viewer = new ChartViewer();
// Einstellungen setzen
ThreeDScatterChart c = new ThreeDScatterChart(this.size, this.size);
c.setPlotRegion((int)(this.size / 2), (int)(this.size * 0.48), (int)(this.size * 0.6), (int)(this.size * 0.6), (int)(this.size * 0.45));
c.xAxis().setTitle("R", "Arial Bold", 10);
c.yAxis().setTitle("G", "Arial Bold", 10);
c.zAxis().setTitle("B", "Arial Bold", 10);
c.xAxis().setDateScale(0, 255);
c.yAxis().setDateScale(0, 255);
c.zAxis().setDateScale(0, 255);
c.setViewAngle(alpha, beta);
double[] x, y, z;
// Bildpunkte
if (colorize) {
x = new double[1];
y = new double[1];
z = new double[1];
for (RGB p : image) {
x[0] = p.r;
y[0] = p.g;
z[0] = p.b;
// Koordinaten Form Größe Farbe ARGB Rahmen ARGB
c.addScatterGroup(x,y,z, "", Chart.CircleShape, 5, p.toInt(224), 0xFF000000);
}
} else {
x = new double[image.size()];
y = new double[image.size()];
z = new double[image.size()];
for (int i = 0; i < image.size(); i++) {
x[i] = image.get(i).r;
y[i] = image.get(i).g;
z[i] = image.get(i).b;
}
// Koordinaten Form Größe Farbe ARGB Rahmen ARGB
c.addScatterGroup(x,y,z, "", Chart.CircleShape, 5, 0xE0FF0000, 0xFF000000);
}
// Quantenpunkte
x = new double[quants.size()];
y = new double[quants.size()];
z = new double[quants.size()];
for (int i = 0; i < quants.size(); i++) {
x[i] = quants.get(i).r;
y[i] = quants.get(i).g;
z[i] = quants.get(i).b;
}
c.addScatterGroup(x,y,z, "", Chart.CircleShape, 12);
viewer.setChart(c);
drawPanel.removeAll();
drawPanel.add(viewer);
frame.pack();
}
/**
* Lies die vorhandenen JPG-Dateien aus dem Ordner inputs aus
*
* @return String[] Dateinamen
*/
private String[] getJPGs() {
ArrayList<String> result = new ArrayList<String>();
File d = new File("./inputs/");
File[] list = d.listFiles();
for(int i=0; i<list.length; i++) {
String n = list[i].getName();
// nur JPG-Bilder
if (n.matches(".*\\.[jJ][pP][eE]?[gG]$")) {
result.add(n);
}
}
String[] ret = new String[result.size()];
return result.toArray(ret);
}
/**
* Button-Reaktivität
*
* @param e ActionEvent
*/
public void actionPerformed(ActionEvent e) {
/**
* Pfeilbuttons: Ändern der Ansicht
*/
if (e.getSource() == this.vr) beta = (beta + 345) % 360;
if (e.getSource() == this.vl) beta = (beta + 15) % 360;
if (e.getSource() == this.vu) alpha = (alpha + 345) % 360;
if (e.getSource() == this.vd) alpha = (alpha + 15) % 360;
/**
* Datei laden und RGB-Daten in ArrayList speichern
*/
if (e.getSource() == this.b_load) {
try {
this.orig = Image.readFile("./inputs/" + (String)this.s_input.getSelectedItem());
this.image = new ArrayList<>();
for (RGB p : this.orig) {
// kopiere die originalen Daten, damit die Liste später gemischt werden kann
this.image.add(p);
}
} catch (Exception ex) {}
}
/**
* Zufällige Punkte erzeugen
*/
if (e.getSource() == this.b_gen) {
this.quants = new ArrayList<>();
for (int i = 0; i < Integer.parseInt(this.t_anz.getText()); i++) {
this.quants.add(new RGB(true));
}
}
/**
* Epoche durchlaufen
*/
if (e.getSource() == this.b_epoc) Quant.doEpoch(this.image, this.quants);
/**
* Nicht bewegte Punkte versetzen
*/
if (e.getSource() == this.b_reset) Quant.resetQuants(this.quants);
/**
* quantifiziertes Bild speichern
*/
if (e.getSource() == this.b_save) {
try {
Image.writeFile("./inputs/" + (String)this.s_input.getSelectedItem(), "./outputs/" + this.t_output.getText(), this.orig, this.quants);
} catch (Exception ex) {}
}
// neue Anzeige rendern
this.plot();
}
}