图像无法正确生成

时间:2012-10-13 21:23:39

标签: java file io hashmap bufferedimage

今天早些时候,我问了一个关于如何按顺序放置图像作为整个图片的一部分的问题,这样我就可以生成像旧的口袋妖怪游戏中看到的2D地图。一切都是以瓷砖为基础的。

我已经到了我自己生成地图的地步,但它有点滑稽。

当我用Tile Objects填充HashMap时,我已经跟踪了这个问题。 Tile对象包含Name和BufferedImage。似乎问题是程序如何从填充了tile(png文件)的文件夹中读取文件并将它们放在HashMap中。

以下是将Tile对象放在HashMap中的代码:

private static HashMap<Integer, Tile> getTiles(String path) throws IOException {
    HashMap<Integer, Tile> temp = new HashMap<>();
    File folder = new File(path);
    Tile tile;
    int counter = 0;
    for(File file : folder.listFiles()) {
        if(file.isFile()) {
            try {
                if(file.getCanonicalPath().endsWith(".png")) {
                    tile = new Tile(file.getName(),ImageIO.read(file));
                    temp.put(counter, tile);
                    counter++;
                }
            } catch(IOException ioe) {
                System.out.println("Picture number " + counter + " could "
                        + "not be saved in the hashmap: \n"
                        + ioe.getMessage());
                continue;
            }
        }
    }
    return temp;
}

当我在HashMap上执行toString()时,这是输出:

Tiles: (0,0.png)(1,1.png)(2,10.png)(3,100.png)....

注意如果在1.png之后它开始计数10,然后是100,然后是101,然后是102 ...然后当它达到112时,它开始计数如下:

(112,2.png)(113,20.png)(114,200.png)(115,201.png)...

此文件夹中共有220个Tiles,(计算tile 0.png)。 我清楚地看到问题是什么,但不是我如何解决它。

2 个答案:

答案 0 :(得分:1)

您可以将图像文件的名称更改为001.png,002.png等等(所有名称具有相同的长度,前导零)。这将让您按正确的顺序阅读文件。

答案 1 :(得分:1)

我猜测folder.listFiles()不会按顺序返回文件。您可以将它们放入List然后对其进行排序,但这不是一个好方法。如果图片50.png被删除而某人添加了100000.png,那么49之后的所有图片都会被移过一张。这可能很容易被发现。

更好的方法是将文件名拆分为句点并将其解析为int。

以下是拆分文件名的方法:

String filename = file.getName();
String[] parts = filename.split("\\.");
counter = Integer.parseInt(parts[0]);

使用这种方法,您不再需要递增计数器。如果图像丢失,它也不会对图块进行不正确的编号。