185 lines
5.5 KiB
Java
185 lines
5.5 KiB
Java
package creation;
|
|
|
|
import java.awt.Color;
|
|
import java.awt.Font;
|
|
import java.awt.Graphics;
|
|
import java.awt.image.BufferedImage;
|
|
import java.io.File;
|
|
import java.io.FileOutputStream;
|
|
import java.io.IOException;
|
|
import java.io.PrintWriter;
|
|
import java.nio.file.Files;
|
|
import java.security.MessageDigest;
|
|
import java.security.NoSuchAlgorithmException;
|
|
import java.util.Random;
|
|
import java.util.UUID;
|
|
|
|
import javax.imageio.ImageIO;
|
|
|
|
public class Creator {
|
|
public static void main(String[] args) {
|
|
Random r = new Random(1);
|
|
|
|
String basedir = "outputdir/data";
|
|
String[] names = NameCreator.generateNames(r);
|
|
|
|
try {
|
|
FileOutputStream collectionOutput = new FileOutputStream(basedir + "/collection.json");
|
|
PrintWriter collectionWriter = new PrintWriter(collectionOutput);
|
|
collectionWriter.write("{\n \"textures\": [\n ");
|
|
boolean first = true;
|
|
int i=1;
|
|
for (String name : names) {
|
|
if (first) {
|
|
first = false;
|
|
} else {
|
|
collectionWriter.write(",\n ");
|
|
}
|
|
System.out.println("Creating " + name + " (texture " + i + " of " + names.length + ")");
|
|
storeImage(name, basedir, r, collectionWriter);
|
|
i++;
|
|
}
|
|
collectionWriter.write("\n ]\n}\n");
|
|
collectionWriter.close();
|
|
collectionOutput.close();
|
|
} catch (IOException e) {
|
|
e.printStackTrace();
|
|
}
|
|
}
|
|
|
|
private static boolean randBool(Random r, double probability) {
|
|
return r.nextDouble() < probability;
|
|
}
|
|
|
|
private static void storeImage(String name, String outputdir, Random r, PrintWriter collectionWriter)
|
|
throws IOException {
|
|
int size = 256 * (1 << r.nextInt(6));
|
|
NamedColor[] shuffling = Dictionary.colors.clone();
|
|
NamedColor[] mycolors = new NamedColor[3];
|
|
for (int i = 0; i < 3; i++) {
|
|
int otherPos = r.nextInt(7 - i) + i;
|
|
mycolors[i] = shuffling[otherPos];
|
|
shuffling[otherPos] = shuffling[i];
|
|
}
|
|
MyDate date = randomDate(r);
|
|
|
|
boolean grey = randBool(r, 0.01);
|
|
boolean border = randBool(r, 0.1);
|
|
boolean bold = randBool(r, 0.03);
|
|
boolean italic = randBool(r, 0.07);
|
|
BufferedImage img = createImage(size, name, mycolors, date, grey, border, bold, italic);
|
|
|
|
File tmpLocation = new File(outputdir + "/tempimage");
|
|
ImageIO.write(img, name.substring(name.length() - 3), tmpLocation);
|
|
String hash = hashFile(tmpLocation);
|
|
String ending = name.substring(name.length() - 3);
|
|
if (ending.equals("jpg")) {
|
|
ending = "jpeg";
|
|
}
|
|
tmpLocation.renameTo(new File(outputdir + "/textures/" + hash));
|
|
String tags = mycolors[0].name + "\", \"" + mycolors[1].name + "\", \"" + mycolors[2].name;
|
|
if (grey) {
|
|
tags += "\", \"grey";
|
|
}
|
|
if (border) {
|
|
tags += "\", \"border";
|
|
}
|
|
if (bold) {
|
|
tags += "\", \"bold";
|
|
}
|
|
if (italic) {
|
|
tags += "\", \"italic";
|
|
}
|
|
collectionWriter.write("{\n");
|
|
collectionWriter.write(" \"id\": \"" + UUID.randomUUID() + "\",\n");
|
|
collectionWriter.write(" \"name\": \"" + name + "\",\n");
|
|
collectionWriter.write(" \"tags\": [\"" + tags + "\"],\n");
|
|
collectionWriter.write(" \"format\": \"" + ending + "\",\n");
|
|
collectionWriter.write(" \"resolution\": [" + size + ", " + size + "],\n");
|
|
collectionWriter.write(" \"added_on\": " + date.asJsonArray() + ",\n");
|
|
collectionWriter.write(" \"texture_hash\": \"" + hash + "\"\n");
|
|
collectionWriter.write(" }");
|
|
}
|
|
|
|
private static MyDate randomDate(Random r) {
|
|
int back = (int) (-300 * Math.log(r.nextDouble()));
|
|
return new MyDate(3, 6, 2019).ago(back);
|
|
}
|
|
|
|
private final static char[] hexArray = "0123456789ABCDEF".toCharArray();
|
|
|
|
public static String bytesToHex(byte[] bytes) {
|
|
char[] hexChars = new char[bytes.length * 2];
|
|
for (int j = 0; j < bytes.length; j++) {
|
|
int v = bytes[j] & 0xFF;
|
|
hexChars[j * 2] = hexArray[v >>> 4];
|
|
hexChars[j * 2 + 1] = hexArray[v & 0x0F];
|
|
}
|
|
return new String(hexChars);
|
|
}
|
|
|
|
private static String hashFile(File f) throws IOException {
|
|
byte[] data = Files.readAllBytes(f.toPath());
|
|
try {
|
|
MessageDigest hash = MessageDigest.getInstance("SHA-256");
|
|
byte[] hashval = hash.digest(data);
|
|
return bytesToHex(hashval);
|
|
} catch (NoSuchAlgorithmException e) {
|
|
e.printStackTrace();
|
|
return null;
|
|
}
|
|
}
|
|
|
|
private static BufferedImage createImage(int size, String name, NamedColor[] colors, MyDate date, boolean grey,
|
|
boolean border, boolean bold, boolean italic) {
|
|
BufferedImage img = new BufferedImage(size, size, BufferedImage.TYPE_INT_RGB);
|
|
Graphics g = img.getGraphics();
|
|
|
|
// background
|
|
if (grey) {
|
|
g.setColor(Color.LIGHT_GRAY);
|
|
} else {
|
|
g.setColor(Color.WHITE);
|
|
}
|
|
g.fillRect(0, 0, size, size);
|
|
|
|
// border
|
|
if (border) {
|
|
int w = size / 40;
|
|
int l = size - 2*w;
|
|
g.setColor(Color.BLACK);
|
|
g.fillRect(w, w, l, w);
|
|
g.fillRect(w, w, w, l);
|
|
g.fillRect(w, l, l, w);
|
|
g.fillRect(l, w, w, l);
|
|
}
|
|
|
|
// text
|
|
int fontstyle = Font.PLAIN;
|
|
if (bold) {
|
|
fontstyle |= Font.BOLD;
|
|
}
|
|
if (italic) {
|
|
fontstyle |= Font.ITALIC;
|
|
}
|
|
Font f = new Font("Arial", fontstyle, size / 10);
|
|
g.setFont(f);
|
|
g.setColor(Color.BLACK);
|
|
int width = g.getFontMetrics().stringWidth(name);
|
|
int basey = size / 2 + g.getFontMetrics().getAscent();
|
|
int textheight = g.getFontMetrics().getHeight();
|
|
g.drawString(name, (size - width) / 2, basey);
|
|
g.drawString(size + " x " + size, (size - width) / 2, basey + textheight);
|
|
g.drawString(date.asReadableString(), (size - width) / 2, basey + 2 * textheight);
|
|
|
|
// color dots
|
|
for (int i = 0; i < 3; i++) {
|
|
NamedColor current = colors[i];
|
|
g.setColor(current.color);
|
|
g.fillOval((1 + 3 * i) * size / 10, size * 3 / 10, size / 5, size / 5);
|
|
}
|
|
|
|
return img;
|
|
}
|
|
}
|