2

黒のピクセルと100%透明なピクセルのみを含む合成png画像を作成するJavaプログラムがあります。これらのコンポジットのサイズを可能な限り小さくしようとしていますが、ImageIO.writeは常に32ビットのPNGを出力します。画像は合計2色しかないことを考慮して、代わりに8ビットとして保存したいと思いますが、標準のJava関数でこれを行う方法はないと思います。

BufferedImageから8ビットのpngを作成するビルド済みの関数を知っている人はいますか?これらのpngのサイズを小さくするための他のアドバイスも大歓迎です!

4

2 に答える 2

2

よくわかりませんが、ImageIOどのタイプを使用するかはわかりませんBufferedImage。利用可能なさまざまなタイプで遊んでみてください。有望TYPE_CUSTOMに見えます。TYPE_BYTE_BINARY

于 2012-10-11T18:55:21.017 に答える
1

これを少し後部座席に入れなければなりませんでしたが、昨日戻ってきて、その方法を見つけました。基本的には、下のクラスcom.sun.imageio.plugins.pngとカスタムを使用することになりましたImageWriteParam

カラーテーブルを自分で作成する必要がありました (それほど難しくなく、バイト配列だけです)。次に、カラー テーブルが に渡されましたImageTypeSpecifier.createIndexed。返された結果により、ピクセルをコピーしたImageTypeSpecifierを作成できます。BufferedImage

次に、カスタム PNG ヘッダーを を使用して作成しましPNGMetadataた (PNG 仕様について多くを読む必要がありましたが、全体的には非常に簡単です)。IIOImage次に、上記のメタデータと BufferedImage を使用して新しいものを作成しました。

最後に、 を作成し、そこからPNGImageWriterデフォルトを取得しましImageWriteParamた。ImageTypeSpecifier次に、以前からそのsetDestinationTypeメソッドに単純に渡しました。最後のステップは、IIOImage と ImageWriteParam を PNGImageWriter に渡すことによって、PNG をディスクに書き込むことでした。

これらのクラスの多くに関するドキュメントは非常にまばらですが、それらの機能は優れています。これを行うことで、ビット深度 1 を含む最小限の PNG を作成し (色が 2 つしかないため)、PNG のサイズを平均 78% 縮小しました!!! 努力する価値は大いにあります。

于 2012-11-09T14:46:03.483 に答える