package tools.map.making;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.RenderingHints;
import java.awt.image.BufferedImage;
import java.io.File;
import javax.imageio.IIOImage;
import javax.imageio.ImageIO;
import javax.imageio.ImageWriteParam;
import javax.imageio.ImageWriter;
import javax.imageio.plugins.jpeg.JPEGImageWriteParam;
import javax.imageio.stream.FileImageOutputStream;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import tools.image.FileOpen;
/**
* Takes an image and shrinks it. Used for making small images.
*/
public class ImageShrinker {
private static File s_mapFolderLocation = null;
private static final String TRIPLEA_MAP_FOLDER = "triplea.map.folder"; // TODO: find other duplications of this value.
public static void main(final String[] args) throws Exception {
handleCommandLineArgs(args);
JOptionPane.showMessageDialog(null,
new JLabel("<html>" + "This is the ImageShrinker, it will create a smallMap.jpeg file for you. "
+ "<br>Put in your base map or relief map, and it will spit out a small scaled copy of it."
+ "<br>Please note that the quality of the image will be worse than if you use a real painting program."
+ "<br>So we suggest you instead shrink the image with paint.net or photoshop or gimp, etc, then clean it "
+ "up before saving."
+ "</html>"));
final File mapFile = new FileOpen("Select The Large Image", s_mapFolderLocation, ".gif", ".png").getFile();
if (mapFile == null || !mapFile.exists()) {
throw new IllegalStateException(mapFile + "File does not exist");
}
if (s_mapFolderLocation == null) {
s_mapFolderLocation = mapFile.getParentFile();
}
final String input = JOptionPane.showInputDialog(null, "Select scale");
final float scale = Float.parseFloat(input);
final Image baseImg = ImageIO.read(mapFile);
final int thumbWidth = (int) (baseImg.getWidth(null) * scale);
final int thumbHeight = (int) (baseImg.getHeight(null) * scale);
// based on code from
// http://www.geocities.com/marcoschmidt.geo/java-save-jpeg-thumbnail.html
// draw original image to thumbnail image object and
// scale it to the new size on-the-fly
final BufferedImage thumbImage = new BufferedImage(thumbWidth, thumbHeight, BufferedImage.TYPE_INT_RGB);
final Graphics2D graphics2D = thumbImage.createGraphics();
graphics2D.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
graphics2D.drawImage(baseImg, 0, 0, thumbWidth, thumbHeight, null);
// save thumbnail image to OUTFILE
final File file = new File(new File(mapFile.getPath()).getParent() + File.separatorChar + "smallMap.jpeg");
final FileImageOutputStream out = new FileImageOutputStream(file);
final ImageWriter encoder = ImageIO.getImageWritersByFormatName("JPEG").next();
final JPEGImageWriteParam param = new JPEGImageWriteParam(null);
param.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
param.setCompressionQuality((float) 1.0);
encoder.setOutput(out);
encoder.write(null, new IIOImage(thumbImage, null, null), param);
out.close();
System.out.println("Image successfully written to " + file.getPath());
System.exit(0);
}
private static String getValue(final String arg) {
final int index = arg.indexOf('=');
if (index == -1) {
return "";
}
return arg.substring(index + 1);
}
private static void handleCommandLineArgs(final String[] args) {
// arg can only be the map folder location.
if (args.length == 1) {
String value;
if (args[0].startsWith(TRIPLEA_MAP_FOLDER)) {
value = getValue(args[0]);
} else {
value = args[0];
}
final File mapFolder = new File(value);
if (mapFolder.exists()) {
s_mapFolderLocation = mapFolder;
} else {
System.out.println("Could not find directory: " + value);
}
} else if (args.length > 1) {
System.out.println("Only argument allowed is the map directory.");
}
// might be set by -D
if (s_mapFolderLocation == null || s_mapFolderLocation.length() < 1) {
final String value = System.getProperty(TRIPLEA_MAP_FOLDER);
if (value != null && value.length() > 0) {
final File mapFolder = new File(value);
if (mapFolder.exists()) {
s_mapFolderLocation = mapFolder;
} else {
System.out.println("Could not find directory: " + value);
}
}
}
}
}