summaryrefslogtreecommitdiff
path: root/src/aufgaben/imageio/Komprimierung1.java
diff options
context:
space:
mode:
authorLeonard Kugis <leonard@kug.is>2022-04-25 18:36:30 +0200
committerLeonard Kugis <leonard@kug.is>2022-04-25 18:36:30 +0200
commit84e220b332bfffb0f2dcc39b9697a6fd6691d265 (patch)
tree0b861a9a099017ffd9bf00bae12e33ed6a309bbe /src/aufgaben/imageio/Komprimierung1.java
Initial commitHEADmaster
Diffstat (limited to 'src/aufgaben/imageio/Komprimierung1.java')
-rwxr-xr-xsrc/aufgaben/imageio/Komprimierung1.java225
1 files changed, 225 insertions, 0 deletions
diff --git a/src/aufgaben/imageio/Komprimierung1.java b/src/aufgaben/imageio/Komprimierung1.java
new file mode 100755
index 0000000..2265560
--- /dev/null
+++ b/src/aufgaben/imageio/Komprimierung1.java
@@ -0,0 +1,225 @@
+package aufgaben.imageio;
+
+import java.awt.Color;
+import java.awt.Graphics;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.WindowAdapter;
+import java.awt.event.WindowEvent;
+import java.awt.image.BufferedImage;
+import java.io.BufferedInputStream;
+import java.io.BufferedOutputStream;
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.FileReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.nio.ByteBuffer;
+import java.util.ArrayList;
+
+import javax.imageio.ImageIO;
+import javax.swing.JButton;
+import javax.swing.JPanel;
+import javax.swing.JSpinner;
+import javax.swing.JTextField;
+import javax.swing.SpinnerNumberModel;
+
+import aufgaben.Aufgabe;
+import misc.CompressedImage;
+import misc.Stapel;
+import misc.Utils;
+
+public class Komprimierung1 extends Aufgabe {
+
+ private final int width = 500, height = 500;
+ private boolean done = false;
+ private String name;
+ private JPanel panel;
+ private JTextField inPath, outPath;
+ private JButton readButton, writeButton, compButton;
+ private JSpinner spinnerWidth, spinnerHeight, spinnerColors;
+ private BufferedImage bild, towrite;
+ private CompressedImage compressed;
+ private ArrayList<Byte[]> compData;
+
+ public Komprimierung1() {
+ name = "Komprimierung 1";
+ this.setSize(width, height);
+ this.setTitle(name);
+ this.addWindowListener(
+ new WindowAdapter() {
+ @Override
+ public void windowClosing(WindowEvent e) {
+ System.out.println("close");
+ done = true;
+ }
+ }
+ );
+ this.setLayout(null);
+ }
+
+ @Override
+ public boolean done() {
+ return done;
+ }
+
+ @Override
+ public String getName() {
+ return name;
+ }
+
+ @Override
+ public void init() {
+ inPath = new JTextField();
+ inPath.setBounds(20, 40, 150, 20);
+ outPath = new JTextField();
+ outPath.setBounds(20, 70, 150, 20);
+ readButton = new JButton("Lesen");
+ readButton.setBounds(180, 40, 100, 20);
+ readButton.addActionListener(new ActionListener() {
+ public void actionPerformed(ActionEvent arg0) {
+ //bild = readImage(new File(inPath.getText()));
+ try {
+ bild = ImageIO.read(new File("title.png"));
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+
+ towrite = new BufferedImage(bild.getWidth(), bild.getHeight(), bild.getType());
+ for(int x = 0, width = towrite.getWidth(); x<width; x++) {
+ for(int y = 0, height = towrite.getHeight(); y<height; y++) {
+ towrite.setRGB(x, y, bild.getRGB(x, y));
+ }
+ }
+
+ panel.repaint();
+ }
+ });
+ writeButton = new JButton("Schreiben");
+ writeButton.setBounds(180, 70, 100, 20);
+ writeButton.addActionListener(new ActionListener() {
+ public void actionPerformed(ActionEvent arg0) {
+ writeImage(new File(outPath.getText()));
+ }
+ });
+ spinnerWidth = new JSpinner(new SpinnerNumberModel(32, 1, 4096, 1));
+ spinnerWidth.setBounds(290, 40, 50, 20);
+ spinnerHeight = new JSpinner(new SpinnerNumberModel(32, 1, 4096, 1));
+ spinnerHeight.setBounds(350, 40, 50, 20);
+ spinnerColors = new JSpinner(new SpinnerNumberModel(8, 1, 4096, 1));
+ spinnerColors.setBounds(410, 40, 50, 20);
+ compButton = new JButton("Komprimieren");
+ compButton.setBounds(290, 70, 120, 20);
+ compButton.addActionListener(new ActionListener() {
+ public void actionPerformed(ActionEvent arg0) {
+ compressed = new CompressedImage(bild, (int)spinnerWidth.getValue(), (int)spinnerHeight.getValue(), (int)spinnerColors.getValue());
+ towrite = compressed.getImage();
+ panel.repaint();
+ }
+ });
+
+ panel = new JPanel() {
+ public void paint(Graphics g) {
+ if(towrite != null)
+ g.drawImage(towrite, 0, 0, 500, 390, this);
+ }
+ };
+ panel.setBounds(0, 110, 500, 390);
+ this.add(inPath);
+ this.add(outPath);
+ this.add(readButton);
+ this.add(writeButton);
+ this.add(spinnerWidth);
+ this.add(spinnerHeight);
+ this.add(spinnerColors);
+ this.add(compButton);
+ this.add(panel);
+ this.repaint();
+ }
+
+ private BufferedImage getGreyImage(BufferedImage i) {
+ BufferedImage image = new BufferedImage(i.getWidth(), i.getHeight(), i.getType());
+ for(int x = 0, width = i.getWidth(); x<width; x++) {
+ for(int y = 0, height = i.getHeight(); y<height; y++) {
+ Color c = new Color(i.getRGB(x, y));
+ int h = (int)(((double)(c.getRed()+c.getGreen()+c.getBlue())/765)*255);
+ image.setRGB(x, y, new Color(h, h, h).getRGB());
+ }
+ }
+ return image;
+ }
+
+ private BufferedImage readImage(File file) {
+ FileInputStream fis;
+ BufferedInputStream bis;
+ try {
+ fis = new FileInputStream(file);
+ bis = new BufferedInputStream(fis);
+ byte[] b = new byte[1];
+ bis.read(b);
+ switch(b[0]) {
+ case ImageType.RAW:
+
+ break;
+ case ImageType.COMPRESSED:
+ break;
+ }
+ int width = Utils.byteArrayToInt(b);
+ bis.read(b);
+ int height = Utils.byteArrayToInt(b);
+ bis.read(b);
+ int type = Utils.byteArrayToInt(b);
+ BufferedImage image = new BufferedImage(width, height, type);
+ for(int x = 0; x<width; x++) {
+ for(int y = 0; y<height; y++) {
+ bis.read(b);
+ image.setRGB(x, y, Utils.byteArrayToInt(b));
+ }
+ }
+ bis.close();
+ fis.close();
+ return image;
+ } catch (FileNotFoundException e) {
+ e.printStackTrace();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ return null;
+ }
+
+ private void writeImage(File file) {
+ FileOutputStream fos;
+ BufferedOutputStream bos;
+ try {
+ fos = new FileOutputStream(file);
+ bos = new BufferedOutputStream(fos);
+ if(compData == null) {
+ bos.write(ImageType.RAW);
+ } else {
+ bos.write(ImageType.COMPRESSED);
+ }
+ if(compData == null) {
+ bos.write(Utils.intTobyteArray(towrite.getWidth()));
+ bos.write(Utils.intTobyteArray(towrite.getHeight()));
+ bos.write(Utils.intTobyteArray(towrite.getType()));
+ for(int x = 0, width = towrite.getWidth(); x<width; x++) {
+ for(int y = 0, height = towrite.getHeight(); y<height; y++) {
+ bos.write(Utils.intTobyteArray(towrite.getRGB(x, y)));
+ }
+ }
+ } else {
+ bos.write(compressed.getData());
+ }
+ bos.close();
+ fos.close();
+ } catch (FileNotFoundException e) {
+ e.printStackTrace();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+
+}