KI_RGBQuant/Image.java

102 lines
3.1 KiB
Java

import java.util.ArrayList;
import java.io.File;
import java.awt.Color;
import java.awt.image.BufferedImage;
import javax.imageio.ImageIO;
/**
* Beschreiben Sie hier die Klasse Image.
*
* @author Alexander Kimmig
* @version 1.0
*/
public class Image
{
/**
* Liest eine JPG-Bilddatei ein und gibt diese als ArrayList von RGB-Objekten zurück
*
* @param filename Dateiname die eingelesen werden soll
* @return ArrayList<RGB> der einzelnen Pixelwerte
* @throws Exception
*/
public static ArrayList<RGB> readFile(String filename) throws Exception {
ArrayList<RGB> points = new ArrayList<>();
File file= new File(filename);
BufferedImage img = ImageIO.read(file);
for (int y = 0; y < img.getHeight(); y++) {
for (int x = 0; x < img.getWidth(); x++) {
points.add(new RGB(img.getRGB(x,y)));
}
}
return points;
}
/**
* Liest eine JPG-Bilddatei ein und gibt diese als ArrayList von RGB-Objekten zurück
*
* @param filename Dateiname die eingelesen werden soll
* @return BufferedImage
* @throws Exception
*/
public static BufferedImage loadFile(String filename) throws Exception {
ArrayList<RGB> points = new ArrayList<>();
File file= new File(filename);
return ImageIO.read(file);
}
/**
* Schreibt die RGB-Daten in eine Datei
*
* @param input Dateiname der ursprünglichen Datei (wird für Dimensionen gebraucht)
* @param output Dateiname der neuen Datei
* @param data RGB-Daten der einzelnen Pixel
* @return BufferedImage
*/
public static BufferedImage writeFile(String input, String output, ArrayList<RGB> data) throws Exception {
File file = new File(input);
BufferedImage img = ImageIO.read(file);
int w = img.getWidth();
int y = 0, x = 0;
for (RGB p : data) {
img.setRGB(x, y, p.toInt());
if (++x >= w) {
x = 0;
++y;
}
}
if (output != "") {
File f = new File(output);
ImageIO.write(img, "jpg", f);
}
return img;
}
/**
* Schreibt die RGB-Daten in eine Datei anhand der Quantifizierungs-Punkte
* Jeder Pixel bekommt die Farbe des nächstliegenden Quantifizierungs-Punktes.
*
* @param input Dateiname der ursprünglichen Datei (wird für Dimensionen gebraucht)
* @param output Dateiname der neuen Datei
* @param data RGB-Daten der einzelnen Pixel
* @param quants Quantifizierungs-Punkte
* @return BufferedImage
*/
public static BufferedImage writeFile(String input, String target, ArrayList<RGB> data, ArrayList<RGB> quants) throws Exception {
ArrayList<RGB> q = new ArrayList<>();
// Mappe punkte auf quantifizierte Punkte
for (RGB p : data) {
q.add(Quant.findNearest(quants, p));
}
// schreibe Datei
return writeFile(input, target, q);
}
}