3

一連の画像をpng形式で圧縮しようとしています。圧縮はうまくいっているようです:

FileOutputStream fos = null;
GZIPOutputStream gzip = null;
fos = new FileOutputStream(PATH_SAVE_GZIP);
gzip = new GZIPOutputStream(fos);
for (int i = 0; i < NB_OF_IMAGES; i++) {
     BufferedImage im = images.get(i).getBufImg();
     ImageIO.write(im, "JPEG", gzip);  
}
gzip.finish();
gzip.close();
fos.close();

ただし、このコードで解凍しようとすると、例外 Nullpointer... が発生します。私は何を間違っていますか?

4

2 に答える 2

3

私は自分のプロジェクトを終え、今答えを知っています。これは、いくつかの方法で解決できます。

1 つは、ObjectOutput/Input Stream を使用して、オブジェクトのような BufferedImages を書き込むことです。

もう 1 つは ByteArrayOutputStream を使用してバイトのように画像を書き込む方法です。これを使用する前に、書き込むサイズを知っておく必要があります。そこで、各画像の前にこの書き込みサイズを解決しました。効率的ではありません...しかし、うまくいきます。

        fileOutputStream fos = new FileOutputStream(path);
        GZIPOutputStream gzip = new GZIPOutputStream(fos);
        gzip.write(shortToBytes(numImatges));
        gzip.write(shortToBytes((short) 0));     
        for (int i = 0; i < dates.getNB_OF_IMAGES(); i++) {

            if (images != null) {
                im = images.get(i).getBufImg();
            }
            ByteArrayOutputStream byteOstream = new ByteArrayOutputStream();
            ImageIO.write(im, "jpeg", byteOstream);
            byteOstream.flush();
            byteOstream.close();
            gzip.write(shortToBytes((short) byteOstream.size()));
            gzip.write(byteOstream.toByteArray());


            }
//close streams
于 2013-01-22T02:21:16.593 に答える
0

問題は、すべての画像を1つのGZIPストリームに書き込み、読み取るときにImageIO、1つの画像がどこで終わり、次の画像がどこから始まるかがわからないことです。

2つのオプションがあります。

  1. ZIPの代わりに使用GZIP
  2. jtarまたはJavaTarPackageTARを使用してファイルをファイルにパッケージ化し、次にtarをGZIPします。読み取るときは、最初にUnGZIPを実行し、次にtarファイルから画像を抽出します。
于 2013-01-10T08:54:36.373 に答える