package org.gba.spritely;
import java.awt.image.BufferedImage;
import java.io.File;
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
import org.apache.commons.cli.CommandLine;
import org.apache.commons.cli.CommandLineParser;
import org.apache.commons.cli.HelpFormatter;
import org.apache.commons.cli.Options;
import org.apache.commons.cli.ParseException;
import org.apache.commons.cli.PosixParser;
import org.gba.spritely.color.ColorPalette;
import org.gba.spritely.color.PaletteFinder;
import org.gba.spritely.imgsrc.GoogleImages;
import org.gba.spritely.imgsrc.OpenClipart;
import org.gba.spritely.imgsrc.WikimediaCommons;
import org.gba.spritely.processing.ImageProcessing;
import org.gba.spritely.processing.ImageUtil;
public class Spritely {
private static int setSizePerSource;
public static boolean verbose = true;
public static boolean logTime = false; long time, newtime;
private String recolour = "";
private String outputPath = "";
public int imagesPerSource = 5;
private boolean searchGoogleImages = false;
public String[] googleSearchPrefixes = { "cartoon" };
public String[] googleSearchSuffixes = { "silhouette", "side view" };
private boolean searchOpenClipart = false;
private boolean searchWikimediaCommons = false;
public String query;
private int size = 64;
public String filename = "";
public boolean pickRandom;
public boolean pickRandomPalette;
public static void main(String[] args) {
Options options = new Options();
options.addOption("c", true,
"query for color palettes related to <arg>");
options.addOption("d", true,
"output images will be <arg> pixels wide/high");
options.addOption("n", true,
"<arg> images extracted per image source (Google, Wikimedia, etc.)");
options.addOption("o", true, "images saved to filepath <arg>");
options.addOption("rs", false, "choose images randomly from an initial set");
options.addOption("rc", false, "choose color palette randomly from set");
options.addOption("sgi", false, "search google images");
options.addOption("swm", false, "search wikimedia commons");
options.addOption("soc", false, "search openclipart");
if (args.length == 0) {
HelpFormatter formatter = new HelpFormatter();
formatter.printHelp("spritely", options);
System.exit(0);
}
CommandLineParser p = new PosixParser();
CommandLine cmd = null;
Spritely s = new Spritely();
try {
cmd = p.parse(options, args);
} catch (ParseException e) {
e.printStackTrace();
System.exit(0);
}
String recolourQuery = "";
if (cmd.hasOption("c")) {
recolourQuery = cmd.getOptionValue("c");
if(cmd.hasOption("rc"))
s.pickRandomPalette = true;
}
String outputPath = System.getProperty("user.dir");
if (cmd.hasOption("o")) {
outputPath = cmd.getOptionValue("o");
}
int imagesPerSource = 2;
if (cmd.hasOption("n")) {
imagesPerSource = Integer.parseInt(cmd.getOptionValue("n"));
}
int size = 8;
if (cmd.hasOption("d")) {
size = Integer.parseInt(cmd.getOptionValue("d"));
}
if (cmd.hasOption("rs")) {
s.pickRandom = true;
setSizePerSource = Integer.parseInt(cmd.getOptionValue("s"));
}
s.setImagesPerSource(imagesPerSource);
s.setOutputPath(outputPath);
s.setRecolor(recolourQuery);
s.setSize(size);
s.setQuery(cmd.getArgs()[(cmd.getArgs().length - 1)]);
if (cmd.hasOption("sgi")) {
s.searchGoogleImages = true;
}
if (cmd.hasOption("swm")) {
s.searchWikimediaCommons = true;
}
if (cmd.hasOption("soc")) {
s.searchOpenClipart = true;
}
if ((!s.searchGoogleImages) && (!s.searchOpenClipart)
&& (!s.searchWikimediaCommons)) {
s.searchGoogleImages = true;
s.searchWikimediaCommons = true;
s.searchOpenClipart = true;
}
s.write(s.search());
}
public void write(List<BufferedImage> images) {
if(logTime)
time = System.currentTimeMillis();
ColorPalette cp = null;
if (!recolour.equalsIgnoreCase("")) {
List palettes = PaletteFinder.searchForPalettes(recolour);
if(pickRandomPalette){
Collections.shuffle(palettes);
}
if(logTime){
long newtime = System.currentTimeMillis();
System.out.println("Searching for palettes took " + (newtime - time));
time = newtime;
}
cp = (ColorPalette) palettes.get(0);
}
for (int i = 0; i < Math.min(images.size(), 20); i++) {
BufferedImage image = (BufferedImage) images.get(i);
image = ImageProcessing.shrink(image, size, size);
if(logTime){
long newtime = System.currentTimeMillis();
System.out.println("Resizing took " + (newtime - time));
time = newtime;
}
if (!recolour.equalsIgnoreCase("")) {
ImageProcessing.recolorImage(image, cp, 2);
}
if(logTime){
newtime = System.currentTimeMillis();
System.out.println("Recolour took " + (newtime - time));
time = newtime;
}
if (filename.equalsIgnoreCase("")) {
ImageUtil.writeToFile(image, outputPath + File.separator
+ query.replace(" ","") + i + ".png");
} else {
if(filename.startsWith("."))
filename = filename.substring(1);
ImageUtil.writeToFile(image, outputPath + File.separator
+ filename.replace(" ", "")+".png");
}
if(logTime){
newtime = System.currentTimeMillis();
System.out.println("Write took " + (newtime - time));
time = newtime;
}
}
if(logTime){
long newtime = System.currentTimeMillis();
System.out.println("Total recolour/write took " + (newtime - time));
time = newtime;
}
// if (verbose)
System.out.println("Wrote " + images.size() + " images to "
+ outputPath + File.separator);
}
public void setSize(int size) {
this.size = size;
}
public void setQuery(String query) {
this.query = query;
}
public List<BufferedImage> search() {
if(logTime){
time = System.currentTimeMillis();
System.out.println("Beginning search. Time: " + time);
}
List<BufferedImage> images = new LinkedList<BufferedImage>();
if (this.searchGoogleImages)
images.addAll(GoogleImages.searchGoogle(this));
if(logTime){
newtime = System.currentTimeMillis();
System.out.println("Google took " + (newtime - time));
time = newtime;
}
if (this.searchWikimediaCommons)
images.addAll(WikimediaCommons.searchWMC(this));
if(logTime){
newtime = System.currentTimeMillis();
System.out.println("Wikimedia took " + (newtime - time));
time = newtime;
}
if (this.searchOpenClipart) {
images.addAll(OpenClipart.searchOC(this));
}
if(logTime){
newtime = System.currentTimeMillis();
System.out.println("OpenClipart took " + (newtime - time));
}
return images;
}
public void setRecolor(String recolourQuery) {
this.recolour = recolourQuery;
}
public void setOutputPath(String outputPath) {
this.outputPath = outputPath;
}
public void setImagesPerSource(int imagesPerSource) {
this.imagesPerSource = imagesPerSource;
}
public void setSearchGoogleImages(boolean searchGoogleImages) {
this.searchGoogleImages = searchGoogleImages;
}
public void setSearchOpenClipart(boolean searchOpenClipart) {
this.searchOpenClipart = searchOpenClipart;
}
public void setSearchWikimediaCommons(boolean searchWikimediaCommons) {
this.searchWikimediaCommons = searchWikimediaCommons;
}
public void setOutputFilename(String string) {
filename = string;
}
}