19

Javaで簡単な画像編集プログラムを作成しようとしています。ImageCanvas編集中の画像に関するすべての情報 (いくつかの基本的なプロパティ、適用される効果のリスト、レイヤーのリストなど) を持つオブジェクトを作成し、BufferedImageそれをディスクに保存する簡単な方法が必要でした。後で再び開いた。

Java のデフォルトSerializableインターフェイスを使用することはまさに私が探していたものであり、オブジェクト全体をファイルに書き込んで、後で再びメモリに読み込むことができると考えました。ただし、 をImageCanvas含み、ArrayList<BufferedImage>BufferedImageシリアライズできません (それ以外はすべてシリアライズ可能です)。

writeObject()とメソッドをオーバーライドできることは知っていますが、そうしたことはありません。 Java で他のすべてをシリアル化し、をディスクreadObject()に読み書きする独自の方法があるかどうか疑問に思っていました。または、私が見落としているオブジェクトBufferedImage全体をディスクに簡単に書き込む他の方法はありますか? ImageCanvas最終的には、独自のカスタム イメージ ファイル タイプを実装する可能性がありますが、現時点では、テスト中にファイルを一時的に保存するための迅速かつ簡単な方法が必要でした (ImageCanvasクラスは大きく変更されるため、自分のファイルを更新し続ける必要はありませんでした)。ファイナライズする前のカスタム ファイル タイプ)。

4

2 に答える 2

34

ArrayList<BufferedImage>トランジェントを作成し、カスタムwriteObject()メソッドを実装します。これで、ImageCanvas の通常のデータを書き込んでから、PNG 形式を使用して画像のバイト データを手動で書き出します。

class ImageCanvas implements Serializable {
    transient List<BufferedImage> images;

    private void writeObject(ObjectOutputStream out) throws IOException {
        out.defaultWriteObject();
        out.writeInt(images.size()); // how many images are serialized?
        for (BufferedImage eachImage : images) {
            ImageIO.write(eachImage, "png", out); // png is lossless
        }
    }

    private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
        in.defaultReadObject();
        final int imageCount = in.readInt();
        images = new ArrayList<BufferedImage>(imageCount);
        for (int i=0; i<imageCount; i++) {
            images.add(ImageIO.read(in));
        }
    }
}
于 2013-02-28T05:09:58.080 に答える
0

シリアル化は、静的データを永続化するという点で非常に簡単です。それ以外の場合は、シリアライゼーション ファミリのメソッドで読み取り/書き込みオブジェクトを使用する適切な場所にいます。「BufferedImage」とは何かを考えてみてください。これは、バッファリングされたストリーミングの実装です。シリアル化するには、データを byte[] 配列などの静的オブジェクトにフラッシュする必要があります。次に、バッファリングされたストリーミングがその byte[] 配列に出入りするように、そのオブジェクトを BufferedImage にシリアル化/逆シリアル化することができます。 .

于 2013-02-25T01:36:22.190 に答える