Initial Commit WIP
commit
26c183c1e5
@ -0,0 +1,5 @@
|
||||
bin
|
||||
resources
|
||||
.classpath
|
||||
.project
|
||||
.settings
|
@ -0,0 +1,140 @@
|
||||
package peery.file;
|
||||
|
||||
import java.awt.Dimension;
|
||||
import java.awt.image.BufferedImage;
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.util.ArrayList;
|
||||
|
||||
import javax.imageio.ImageIO;
|
||||
|
||||
import peery.log.Log;
|
||||
import peery.log.LogLevel;
|
||||
|
||||
public class FileHandler {
|
||||
|
||||
public File sourceFolder, InputImagesFolder, TargetImageFile, OutputFolder;
|
||||
/*
|
||||
* sourcePath/ -> all ressources
|
||||
* sourcePath/Images/ -> Input pictures folder
|
||||
* sourcePath/Target -> Target picture file
|
||||
* sourcePath/Output/ -> Output picture folder
|
||||
*/
|
||||
|
||||
public FileHandler(String sourcePath){
|
||||
this.sourceFolder = new File(sourcePath);
|
||||
this.InputImagesFolder = new File(sourceFolder.getAbsolutePath()+"/Images");
|
||||
this.TargetImageFile = new File(sourceFolder.getAbsolutePath()+"/Target");
|
||||
this.OutputFolder = new File(sourceFolder.getAbsolutePath()+"/Output");
|
||||
Log.initLog(this.sourceFolder.getAbsolutePath());
|
||||
this.validateFolderStructure();
|
||||
}
|
||||
|
||||
public boolean validateFolderStructure(){
|
||||
if(this.sourceFolder.isDirectory()){
|
||||
Log.log(LogLevel.Debug, "Detected sourcefolder at "+this.sourceFolder.getAbsolutePath());
|
||||
if(this.InputImagesFolder.isDirectory()){
|
||||
Log.log(LogLevel.Debug, "Detected Input folder at "+this.InputImagesFolder.getAbsolutePath());
|
||||
if(this.OutputFolder.isDirectory()){
|
||||
Log.log(LogLevel.Debug, "Detected Output folder at "+this.OutputFolder.getAbsolutePath());
|
||||
if(this.TargetImageFile.isFile()){
|
||||
Log.log(LogLevel.Debug, "Detected Target Image at "+this.TargetImageFile.getAbsolutePath());
|
||||
return true;
|
||||
}else{
|
||||
Log.log(LogLevel.Critical, "No Target Image found! Exiting...");
|
||||
System.exit(1);
|
||||
}
|
||||
}else{
|
||||
Log.log(LogLevel.Info, "No Output folder found.");
|
||||
Log.log(LogLevel.Info, "Creating one at "+this.OutputFolder.getAbsolutePath());
|
||||
this.OutputFolder.mkdirs();
|
||||
}
|
||||
}else{
|
||||
Log.log(LogLevel.Critical, "No Input folder found.");
|
||||
Log.log(LogLevel.Critical, "Creating one at "+this.InputImagesFolder.getAbsolutePath());
|
||||
this.InputImagesFolder.mkdirs();
|
||||
}
|
||||
}else{
|
||||
Log.log(LogLevel.Critical, "No source folder found.");
|
||||
Log.log(LogLevel.Critical, "Creating one at "+this.sourceFolder.getAbsolutePath());
|
||||
this.sourceFolder.mkdirs();
|
||||
}
|
||||
Log.log(LogLevel.Critical, "Folder validation failed. There could be a permission problem "
|
||||
+ "or a folder needed to be created! Please look for earlier errors.");
|
||||
return false;
|
||||
}
|
||||
|
||||
public BufferedImage loadImage(File file){
|
||||
if(file.isFile() && file.canRead()){
|
||||
BufferedImage img;
|
||||
try {
|
||||
img = ImageIO.read(file);
|
||||
return img;
|
||||
} catch (IOException e) {
|
||||
Log.log(LogLevel.Debug, "File "+file.getPath()+" failed to load as an Image. What did I just read?");
|
||||
e.printStackTrace();
|
||||
return null;
|
||||
}
|
||||
}
|
||||
else{
|
||||
Log.log(LogLevel.Info, "Can't read file "+file.getPath()+" ! It could be a directory or no read permissions.");
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
public Dimension loadBiggestDimension(){
|
||||
File[] files = this.InputImagesFolder.listFiles();
|
||||
int width = 0, height = 0, img_count = 0;
|
||||
for(File f: files){
|
||||
if(f.isFile() && f.canRead()){
|
||||
BufferedImage img = loadImage(f);
|
||||
if(img == null){
|
||||
continue;
|
||||
}
|
||||
img_count++;
|
||||
if(width < img.getWidth()){
|
||||
width = img.getWidth();
|
||||
}
|
||||
if(height < img.getHeight()){
|
||||
height = img.getHeight();
|
||||
}
|
||||
}
|
||||
else{
|
||||
Log.log(LogLevel.Info, "Can't read file"+f.toString()+"! It could be a directory or no read permissions.");
|
||||
}
|
||||
}
|
||||
Log.log(LogLevel.Info, img_count+" image(s) were loaded...");
|
||||
if(width == 0 || height == 0){
|
||||
Log.log(LogLevel.Critical, "Incomplete or no dimension values! Could I load any Image?");
|
||||
}
|
||||
Log.log(LogLevel.Debug, "Biggest dimension is "+width+"x"+height);
|
||||
return new Dimension(width, height);
|
||||
}
|
||||
|
||||
// Would probably kill memory (and performance).
|
||||
@Deprecated
|
||||
public BufferedImage[] loadAllImages(){
|
||||
File[] files = this.InputImagesFolder.listFiles();
|
||||
ArrayList<BufferedImage> imgs = new ArrayList<BufferedImage>();
|
||||
int img_count = 0;
|
||||
for(File f: files){
|
||||
BufferedImage img = loadImage(f);
|
||||
if(img == null){
|
||||
continue;
|
||||
}
|
||||
imgs.add(img);
|
||||
img_count++;
|
||||
}
|
||||
if(imgs.size() == 0){
|
||||
Log.log(LogLevel.Critical, "No Images found in "+this.InputImagesFolder.getAbsolutePath());
|
||||
return null;
|
||||
}
|
||||
Log.log(LogLevel.Info, img_count+" image(s) were loaded...");
|
||||
BufferedImage[] bfs = new BufferedImage[imgs.size()];
|
||||
for(int i = 0; i < imgs.size(); i++){
|
||||
bfs[i] = imgs.get(i);
|
||||
}
|
||||
return bfs;
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,84 @@
|
||||
package peery.log;
|
||||
|
||||
import java.io.BufferedWriter;
|
||||
import java.io.File;
|
||||
import java.io.FileWriter;
|
||||
import java.io.IOException;
|
||||
|
||||
public class Log {
|
||||
|
||||
public static Log log;
|
||||
public static final boolean silenceDebug = false,
|
||||
appendEvents = true, appendErrors = false;
|
||||
|
||||
public final File eventFile, errorFile;
|
||||
private BufferedWriter eventWriter, errorWriter;
|
||||
|
||||
|
||||
public Log(String location){
|
||||
this.eventFile = new File(location+"/eventLog.log");
|
||||
this.errorFile = new File(location+"/ERROR.log");
|
||||
|
||||
try {
|
||||
if(!this.eventFile.exists()){
|
||||
this.eventFile.createNewFile();
|
||||
}
|
||||
if(!this.errorFile.exists()){
|
||||
this.errorFile.createNewFile();
|
||||
}
|
||||
this.eventWriter = new BufferedWriter(new FileWriter(eventFile, appendEvents));
|
||||
this.errorWriter = new BufferedWriter(new FileWriter(errorFile, appendErrors));
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
System.exit(1);
|
||||
}
|
||||
}
|
||||
|
||||
public static void initLog(String location){
|
||||
if(Log.log != null){
|
||||
return;
|
||||
}
|
||||
|
||||
Log.log = new Log(location);
|
||||
}
|
||||
|
||||
public static void log(int logLvl, String message){
|
||||
Log.log.logs(logLvl, message);
|
||||
}
|
||||
|
||||
public static void log(LogLevel lv, String message){
|
||||
Log.log.logs(lv.ordinal(), message);
|
||||
}
|
||||
|
||||
@SuppressWarnings("unused")
|
||||
public void logs(int logLvl, String message){
|
||||
String prefix = LogLevel.values()[logLvl].toString();
|
||||
prefix = "["+prefix+"]";
|
||||
BufferedWriter logWriter;
|
||||
if(silenceDebug && logLvl == LogLevel.Debug.ordinal()){
|
||||
return;
|
||||
}
|
||||
|
||||
if(logLvl == LogLevel.Error.ordinal()){
|
||||
logWriter = this.errorWriter;
|
||||
}
|
||||
else{
|
||||
logWriter = this.eventWriter;
|
||||
}
|
||||
String timeStamp = new java.util.Date().toString();
|
||||
String msg = "["+timeStamp+"]"+prefix+" "+message;
|
||||
System.out.println(msg);
|
||||
try {
|
||||
logWriter.write(msg+"\n");
|
||||
logWriter.flush();
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
public static void main(String[] args){
|
||||
Log.initLog("/home/peery/Software_Projects/EclipseWorkspace/Picture Mosaic/resources/");
|
||||
Log.log(LogLevel.Debug, "Test!");
|
||||
Log.log(LogLevel.Error, "TEST ERROR");
|
||||
}
|
||||
}
|
@ -0,0 +1,9 @@
|
||||
package peery.log;
|
||||
|
||||
public enum LogLevel {
|
||||
Info,
|
||||
Debug,
|
||||
Critical,
|
||||
Error
|
||||
|
||||
}
|
@ -0,0 +1,67 @@
|
||||
package peery.picture;
|
||||
|
||||
import java.awt.Color;
|
||||
import java.awt.image.BufferedImage;
|
||||
import java.awt.image.ColorModel;
|
||||
import java.io.File;
|
||||
|
||||
import peery.file.FileHandler;
|
||||
import peery.log.Log;
|
||||
import peery.log.LogLevel;
|
||||
|
||||
public class Classifier {
|
||||
|
||||
public BufferedImage target;
|
||||
|
||||
public Classifier(FileHandler fh){
|
||||
BufferedImage target = fh.loadImage(fh.TargetImageFile);
|
||||
}
|
||||
|
||||
public void rasterizeTarget(){
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Plain calculation of average Color of an Image via RGB.
|
||||
* Takes average of RGB values of each pixel.
|
||||
* Does not account for alpha.
|
||||
* @param img Image to process
|
||||
* @param alphaThreshhold value under which pixels are discarded
|
||||
* @return RGB value of the average color
|
||||
*/
|
||||
public int classifyImage(BufferedImage img, File file, int alphaTreshhold){
|
||||
int width = img.getWidth();
|
||||
int height = img.getHeight();
|
||||
Log.log(LogLevel.Debug, "Starting classification of "+file.getPath()+" with width:"+
|
||||
width+" and height:"+height+" ...");
|
||||
|
||||
ColorModel cm = ColorModel.getRGBdefault();
|
||||
float red = 0, green = 0, blue = 0;
|
||||
int pixels = 0;
|
||||
for(int x = 0; x < img.getWidth(); x++){
|
||||
for(int y = 0; y < img.getHeight(); y++){
|
||||
int rgb = img.getRGB(x, y);
|
||||
red += cm.getRed(rgb);
|
||||
blue += cm.getBlue(rgb);
|
||||
green += cm.getGreen(rgb);
|
||||
pixels++;
|
||||
}
|
||||
}
|
||||
red = red/pixels;
|
||||
green = green/pixels;
|
||||
blue = blue/pixels;
|
||||
int rgb = new Color((int)red, (int)green, (int)blue).getRGB();
|
||||
Log.log(LogLevel.Debug, "Classified "+file.getPath()+" with following rgb result: value:"+rgb+
|
||||
" red:"+red+", green:"+green+", blue:"+blue);
|
||||
return rgb;
|
||||
}
|
||||
|
||||
public static void main(String[] args){
|
||||
FileHandler fh = new FileHandler("/home/peery/Software_Projects/EclipseWorkspace/Picture Mosaic/resources");
|
||||
BufferedImage[] bfs = fh.loadAllImages();
|
||||
Classifier cl = new Classifier(fh);
|
||||
cl.classifyImage(bfs[0], new File("DEBUG_VALUE"), 30);
|
||||
System.out.println(fh.loadBiggestDimension());
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,26 @@
|
||||
package peery.window;
|
||||
|
||||
import java.awt.Canvas;
|
||||
import java.awt.Graphics2D;
|
||||
//import java.awt.Rectangle;
|
||||
import java.awt.image.BufferedImage;
|
||||
|
||||
public class MosaicDisplay extends Canvas{
|
||||
|
||||
private Graphics2D g2 = (Graphics2D) this.getGraphics();
|
||||
|
||||
public MosaicDisplay(int width, int height){
|
||||
this.setSize(width, height);
|
||||
}
|
||||
|
||||
public void drawImage(BufferedImage img, int x, int y){
|
||||
|
||||
g2.drawImage(img, null, x, y);
|
||||
}
|
||||
|
||||
public void clear(){
|
||||
//g2.draw(new Rectangle(this.getWidth(), this.getHeight()));
|
||||
this.invalidate();
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,18 @@
|
||||
package peery.window;
|
||||
|
||||
import java.awt.Component;
|
||||
|
||||
import javax.swing.JFrame;
|
||||
|
||||
public class Window extends JFrame{
|
||||
|
||||
public Window(String name, int width, int height, Component display){
|
||||
this.setSize(width, height);
|
||||
this.setName(name);
|
||||
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
|
||||
this.add(display);
|
||||
|
||||
this.setVisible(true);
|
||||
}
|
||||
|
||||
}
|
Loading…
Reference in New Issue