web-dev-qa-db-ja.com

BufferedImagesを含むオブジェクトをシリアル化する方法

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

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

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

17
scaevity

_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));
        }
    }
}
_
32
Sam Barnum

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

0
Darrell Teague