package tools; import com.shavenpuppy.jglib.Resources; import com.shavenpuppy.jglib.resources.ResourceConverter; import com.shavenpuppy.jglib.sprites.ImageBank; import com.shavenpuppy.jglib.sprites.SpriteImage; import java.awt.image.BufferedImage; import java.io.File; import java.io.FileInputStream; import java.util.logging.Level; import java.util.logging.Logger; import javax.imageio.ImageIO; /** * Extracts .png files out of a .jgimage, based on the "imagebank" nodes in sprites.xml * Should work with most imagebanks. Might perhaps not work 100% correctly for imagebanks <= 3.. * @author joris */ public class SpritesExtractor { /** * @param args the command line arguments */ public static void main(String[] args) { if (args.length < 3) { System.out.println("Usage: SpritesExtractor <path to .xml files directory> <path to .jgimage files directory> <destination directory>"); } else { File dirXMLs = new File(args[0]); if (!dirXMLs.isDirectory()) { System.out.println("Error: " + args[0] + " is not a directory."); System.exit(1); } File dirJGIs = new File(args[1]); if (!dirJGIs.isDirectory()) { System.out.println("Error: " + args[1] + " is not a directory."); System.exit(1); } File dirout = new File(args[2]); if (dirout.exists() && dirout.isFile() && !dirout.isDirectory()) { System.out.println("Error: " + args[2] + " is a file"); System.exit(1); } if (!dirout.exists()) { System.out.println("Warning: " + args[2] + " is not a directory. Creating it now."); dirout.mkdirs(); } try { ResourceConverter rc = new ResourceConverter(); includeXML(rc, dirXMLs.getAbsolutePath() + "\\tags.xml"); includeXML(rc, dirXMLs.getAbsolutePath() + "\\sprites.xml"); for (int j = 0; j < 256; j++) { try { ImageBank bank = (ImageBank) Resources.peek("sprites" + j + ".imagebank"); if (bank != null) { String fpath = dirJGIs.getAbsolutePath() + "\\sprites" + j + ".jgimage"; System.out.println("Loading: " + fpath); BufferedImage bim = JGImageUtil.load(new File(fpath)); for (int i = 0; i < bank.numImages(); i++) { SpriteImage si = bank.getImage(i); BufferedImage sub = bim.getSubimage(si.getX(), si.getY(), si.getWidth(), si.getHeight()); ImageIO.write(sub, "png", new File(dirout.getAbsolutePath() + "\\" + si.getName() + ".png")); } System.out.println(" Succesfully saved " + bank.numImages() + " files"); } } catch (Exception e) { e.printStackTrace(); } } } catch (Exception e) { e.printStackTrace(); } } } private static void includeXML(ResourceConverter rc, String xmlFile) { System.out.println("LOADING: " + xmlFile); try { rc.include(new FileInputStream(xmlFile)); } catch (Exception ex) { Logger.getLogger(SpritesExtractor.class.getName()).log(Level.SEVERE, null, ex); } } }