【问题标题】:How to convert bytes from file into an image - Java如何将文件中的字节转换为图像 - Java
【发布时间】:2016-12-16 16:36:31
【问题描述】:
public static void saveMap(String fileName){
    ArrayList<byte[]> mapData = new ArrayList<>();
    for(int i = 0; i < DrawPanel.cells.size(); i++){
        try {
            if(DrawPanel.cells.get(i).image != null){
                ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
                ImageIO.write(DrawPanel.cells.get(i).image,"png",byteArrayOutputStream);
                byte[] bytes = byteArrayOutputStream.toByteArray();
                mapData.add(i,bytes);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    try {
        FileOutputStream fileOutputStream = new FileOutputStream(new File("res/Saved Maps/"+fileName+".map"));
        for(int i = 0; i < mapData.size(); i++){
            fileOutputStream.write(mapData.get(i));
        }
        fileOutputStream.close();
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

它从每个单元格(JPanel)中获取图像,将其转换为字节并将其添加到数组列表中。然后它将数组列表写入文件。 我的问题是,我该如何扭转这种局面?这样我就可以将每个图像放入其各自的单元格中。

【问题讨论】:

  • 请注意,当您从 .jar 文件运行时,写入应用程序资源会失败,因为资源是 .jar 存档中的条目,根本不是文件。
  • 是我,还是这个问题闻起来像XY Problem

标签: java image swing arraylist byte


【解决方案1】:

Java SE1.7 中有 Serializable Object 的概念:

序列化对象意味着将其状态转换为字节流,以便字节流可以恢复为对象的副本。如果 Java 对象的类或其任何超类实现了java.io.Serializable 接口或其子接口java.io.Externalizable,则它是可序列化的。反序列化是将对象的序列化形式转换回对象副本的过程。 (摘自here)。

ArrayList 实现了java.io.Serializable (ArrayList JavaDoc),因此存储的所有元素都是序列化的。

特别是在这种情况下,您可能会改用:

// Serialize the ArrayList mapData
try (OutputStream file = new FileOutputStream("res/Saved Maps/"+fileName+".map");
        OutputStream buffer = new BufferedOutputStream(file);
        ObjectOutput output = new ObjectOutputStream(buffer);) {
    output.writeObject(mapData);
} catch (IOException ex) {
    System.out.println("Error ocurred: " + ex.getMessage());
}

// Deserialize the 'fileName'.map file
try (InputStream file = new FileInputStream("'fileName'.map");
        InputStream buffer = new BufferedInputStream(file);
        ObjectInput input = new ObjectInputStream(buffer);) {
    // Deserialize the ArrayList (serialized on this file)
    ArrayList<byte[]> recoveredMapData = (ArrayList<byte[]>) input.readObject();
    // Display its data
    for (byte[] cell_byte : recoveredMapData) {
        System.out.println("=> " + cell_byte);
    }
} catch (ClassNotFoundException ex) {
    System.out.println("Error ocurred: " + ex.getMessage());
} catch (IOException ex) {
    System.out.println("Error ocurred: " + ex.getMessage());
}

有关 Java SE1.6 和 Java SE1.7 的实现,请参阅此 topic

【讨论】:

    猜你喜欢
    • 2014-01-13
    • 1970-01-01
    • 2021-10-19
    • 1970-01-01
    • 2011-03-07
    • 1970-01-01
    • 2019-12-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多