package tiled.mapeditor.dialogs; import java.awt.Color; import java.awt.Graphics2D; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import java.util.Properties; import javax.imageio.ImageIO; import javax.swing.JLabel; import javax.swing.JPanel; import tiled.core.Map; import tiled.core.Tile; import tiled.core.TileLayer; import tiled.core.TileSet; import tiled.mapeditor.MapEditor; import tiled.mapeditor.widget.IntegerSpinner; public class ConvertImageToTileLayerDialog extends PropertiesDialog { private static final long serialVersionUID = 6590784120296960941L; private Map map; private BufferedImage image; private IntegerSpinner tileWidthSpinner; private IntegerSpinner tileHeightSpinner; public ConvertImageToTileLayerDialog(MapEditor editor, String imageFilename) throws IOException { super(editor.getAppFrame(), new Properties()); this.map = editor.getCurrentMap(); this.image = ImageIO.read(new File(imageFilename)); JPanel tileSizePanel = new JPanel(); tileSizePanel.add(new JLabel("Tile width")); tileWidthSpinner = new IntegerSpinner(map.getTileWidth(), 1, 8192); tileSizePanel.add(tileWidthSpinner); tileSizePanel.add(new JLabel("Tile height")); tileHeightSpinner = new IntegerSpinner(map.getTileHeight(), 1, 8192); tileSizePanel.add(tileHeightSpinner); mainPanel.add(tileSizePanel); pack(); } @Override protected void buildPropertiesAndDispose() { super.buildPropertiesAndDispose(); int tileWidth = tileWidthSpinner.intValue(); int tileHeight = tileHeightSpinner.intValue(); int xTileIncrement = Math.max(1, tileWidth / map.getTileWidth()); int yTileIncrement = Math.max(1, tileHeight / map.getTileHeight()); adjustImage(tileWidth, tileHeight); TileLayer layer = map.addLayer(); TileSet tileset = new TileSet(); tileset.setName(layer.getName()); map.addTileset(tileset); for (int x = 0, ximg = 0; x < map.getWidth(); x += xTileIncrement, ximg += tileWidth) { for (int y = xTileIncrement - 1, yimg = 0; y < map.getHeight(); y += yTileIncrement, yimg += tileHeight) { BufferedImage tileImage = getSubimage(ximg, yimg, tileWidth, tileHeight); if (hasContent(tileImage)) { Tile tile = new Tile(); tile.setImage(tileImage); tile.setProperties(new Properties(properties)); tileset.addNewTile(tile); layer.setTileAt(x, y, tile); } } } } private void adjustImage(int tileWidth, int tileHeight) { int adjustedImageWidth = Math.round((float)image.getTileWidth() / (float)tileWidth) * tileWidth; int adjustedImageHeight = Math.round((float)image.getTileHeight() / (float)tileHeight) * tileHeight; BufferedImage adjustedImage = new BufferedImage(adjustedImageWidth, adjustedImageHeight, image.getType()); Graphics2D g = adjustedImage.createGraphics(); g.setBackground(new Color(0, 0, 0, 0)); g.clearRect(0, 0, adjustedImageWidth, adjustedImageHeight); g.drawImage(image, 0, 0, null); g.dispose(); image = adjustedImage; } private BufferedImage getSubimage(int x, int y, int w, int h) { if ((x + w) > image.getWidth() || (y + h) > image.getHeight()) { return null; } else { return image.getSubimage(x, y, w, h); } } private boolean hasContent(BufferedImage tileImage) { if (null != tileImage) { int w = image.getWidth(); int h = image.getHeight(); for (int y = 0; y < h; ++y) { for (int x = 0; x < w; ++x) { int rgba = image.getRGB(x, y); byte a = (byte) ((rgba >> 24) & 0xff); if (a != 0) { return true; } } } } return false; } }