package tools.image; import java.awt.GraphicsConfiguration; import java.awt.GraphicsEnvironment; import java.awt.Image; import java.awt.MediaTracker; import java.awt.Panel; import java.awt.Rectangle; import java.awt.Toolkit; import java.awt.Transparency; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import javax.imageio.ImageIO; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JOptionPane; import games.strategy.debug.ClientLogger; import games.strategy.triplea.ui.screen.TileManager; import tools.map.making.JTextAreaOptionPane; /** * Utility for breaking an image into seperate smaller images. * User must make a new directory called "newImages" and then run the utility * first. * To create sea zones only, he must choose "Y" at the prompt. To create * territories, he must choose "N" at the prompt. * sea zone images directory must be renamed to "seazone */ public class TileImageBreaker { private static String location = null; private static JFrame observer = new JFrame(); private boolean baseMap; private static File s_mapFolderLocation = null; private static final String TRIPLEA_MAP_FOLDER = "triplea.map.folder"; private static final JTextAreaOptionPane textOptionPane = new JTextAreaOptionPane(null, "TileImageBreaker Log\r\n\r\n", "", "TileImageBreaker Log", null, 500, 300, true, 1, null); /** * main(java.lang.String[] args) * Main program begins here. Creates a new instance of ReliefImageBreaker * and calls createMaps() method to start the computations. * * @param args The command line parameters. * @exception java.lang.Exception * throws */ public static void main(final String[] args) throws Exception { handleCommandLineArgs(args); JOptionPane.showMessageDialog(null, new JLabel("<html>" + "This is the TileImageBreaker, it will create the map image tiles file for you. " + "<br>It will take any image, and break it up into 256x256 pixel squares, and put them all in a folder. " + "<br>You can use this to create the base tiles (background) as well as the relief tiles (art relief)." + "<br>For the base image (the one used to make centers.txt, etc), please save it to a folder called " + "baseTiles" + "<br>For the relief image, please save it to a folder called reliefTiles" + "</html>")); final FileSave locationSelection = new FileSave("Where to save Tile Images?", null, s_mapFolderLocation); location = locationSelection.getPathString(); if (s_mapFolderLocation == null && locationSelection.getFile() != null) { s_mapFolderLocation = locationSelection.getFile().getParentFile(); } if (location == null) { System.out.println("You need to select a folder to save the tiles in for this to work"); System.out.println("Shutting down"); System.exit(0); return; } new TileImageBreaker().createMaps(); } /** * createMaps() * One of the main methods that is used to create the actual maps. Calls on * various methods to get user input and create the maps. * * @exception java.io.IOException * throws */ public void createMaps() throws IOException { // ask user to input image location final Image map = loadImage(); if (map == null) { System.out.println("You need to select a map image for this to work"); System.out.println("Shutting down"); System.exit(0); return; } textOptionPane.show(); for (int x = 0; (x) * TileManager.TILE_SIZE < map.getWidth(null); x++) { for (int y = 0; (y) * TileManager.TILE_SIZE < map.getHeight(null); y++) { final Rectangle bounds = new Rectangle(x * TileManager.TILE_SIZE, y * TileManager.TILE_SIZE, TileManager.TILE_SIZE, TileManager.TILE_SIZE); final GraphicsConfiguration m_localGraphicSystem = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice().getDefaultConfiguration(); final BufferedImage relief = m_localGraphicSystem.createCompatibleImage(TileManager.TILE_SIZE, TileManager.TILE_SIZE, baseMap ? Transparency.BITMASK : Transparency.TRANSLUCENT); relief.getGraphics().drawImage(map, 0, 0, TileManager.TILE_SIZE, TileManager.TILE_SIZE, bounds.x, bounds.y, bounds.x + TileManager.TILE_SIZE, bounds.y + TileManager.TILE_SIZE, observer); final String outFileName = location + File.separator + x + "_" + y + ".png"; ImageIO.write(relief, "png", new File(outFileName)); textOptionPane.appendNewLine("wrote " + outFileName); } } textOptionPane.appendNewLine("\r\nAll Finished!"); textOptionPane.countDown(); textOptionPane.dispose(); JOptionPane.showMessageDialog(null, new JLabel("All Finished")); System.exit(0); } /** * java.awt.Image loadImage() * Asks the user to select an image and then it loads it up into an Image * object and returns it to the calling class. * * @return java.awt.Image img the loaded image */ private static Image loadImage() { System.out.println("Select the map"); final String mapName = new FileOpen("Select The Map", s_mapFolderLocation, ".gif", ".png").getPathString(); if (mapName != null) { final Image img = Toolkit.getDefaultToolkit().createImage(mapName); final MediaTracker tracker = new MediaTracker(new Panel()); tracker.addImage(img, 1); try { tracker.waitForAll(); return img; } catch (final InterruptedException e) { ClientLogger.logQuietly(e); return loadImage(); } } else { return null; } } 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); } } } } }