5

png ファイルの読み書きで問題が発生しました。ImageIO でバイト配列に読み取り、ImageIO を使用してこのバイト配列を再度書き込みます。ただし、ファイルサイズは大幅に増加します。これはどのように起こりますか?

public BufferedImage toBufferedImage(InputStream inputstream) {
    try {
        return ImageIO.read(inputstream);
    } catch (Exception e) {
        throw new IllegalStateException("Can't convert to buffered image", e);
    }
}

public byte[] toByteArray(BufferedImage bufferedImage, String filetype) {
    ByteArrayOutputStream output = new ByteArrayOutputStream();
    try {
        ImageIO.write(bufferedImage, filetype, output);
        return output.toByteArray();
    } catch (Exception e) {
        throw new IllegalStateException(e);
    }
}

フォローアップ: Java で記述され、ネイティブ コードを必要としない圧縮 PNG をサポートするライブラリはありますか?

4

3 に答える 3

5

これはおそらく、Java と元の PNG を作成したものとの間で圧縮アルゴリズムが異なるためです。

于 2012-05-22T16:30:33.913 に答える
1

ドキュメントには、入力ファイルをデコードしていると記載されているため、PNG としてメモリに保持されていません。

現在登録されているものの中から自動的に選択された ImageReader を使用して、提供された File をデコードした結果として BufferedImage を返します。File は ImageInputStream にラップされます。結果のストリームを読み取ることができると主張する登録済みの ImageReader がない場合は、null が返されます。

書き戻すときは、PNG ファイルを再エンコードする必要があり、Java の PNG エンコーディングは、元のファイルを作成したものほど効率的ではないようです。

于 2012-05-22T16:33:08.200 に答える
1

JDK で提供される PNG ライターは、圧縮をサポートしていません。これは次の方法で簡単に確認できます。

w = ImageIO.getImageWritersByFormatName("png").next();
p = w.getDefaultWriteParam();
print("Can compress? "+p.canWriteCompressed());
// Can compress? false

imageio-ext または jai-imageio には、圧縮をサポートする png ライターが含まれている可能性があります: http://java.net/projects/imageio/

于 2012-05-22T16:52:09.210 に答える