ジャバ:低ビット深度のソケットを介して BufferedImage を送信する
-
18-09-2019 - |
質問
タイトルで十分だと思います。私は完全な品質の緩衝剤を持っています、そして、私はそれを低いビットデプスの出力ストリームから送りたいです。アルゴリズムによってピクセルごとに品質が変更されることは望ましくないので、依然としてフル品質のままです。
したがって、目標は、書き込みに必要なバイト数が非常に少ない OuputStream を介して画像を (フル解像度、フル サイズで) 書き込むことです。
ありがとう、
マルティン
解決
画像データを、画像に適した特性を持つ形式にエンコードする必要があります。24 ビット カラーで色数が多く、品質を落とさないようにしたい場合は、おそらく PNG を使用することになりますが、ロスレス JPEG 2000 を検討してください。
品質をある程度落とすことができる場合は、試してください
- 非可逆 JPEG 2000 -- 同じ品質損失でも JPEG よりもはるかに小さい
- 色の数を減らし、カラーマップ形式を使用する
画像にグレーまたは白黒のデータしか含まれていない場合は、そのようにエンコードしていることを確認してください (8 ビット グレーまたは 1 ビット白黒)。次に、その種類の形式 (たとえば、グループ 4 または JBIG2 の TIFF) に合わせて調整されたエンコーダーを使用していることを確認します。
もう 1 つの良いオプションは、画像から不要なメタデータをすべて削除することです (または、エンコーダーがメタデータを一切挿入しないようにすることもできます)。
Java の内容にこだわりたい場合は、おそらく TIFF、PNG、または JPEG を使用する必要があります。サードパーティの画像エンドコーダがあります (たとえば、私の会社、 アタラソフト, 、これらの高度なエンコーダの .NET バージョンを作成しています -- Java ベンダーも存在します)
ご参考までに:ビット深度を減らすことは、通常、品質を下げることを意味します(削減に意味がない場合を除く)。たとえば、24 ビット カラー画像があり、すべての色がグレー (R==G==B) の場合、8 ビット グレーに減っても品質は失われません。これは、画像に 256 色の異なる色のコレクションがあり、カラー マップ (インデックスまたはパレット) 形式に切り替える場合にも当てはまります。バイト数は減りますが、品質は低下しません。
他のヒント
圧縮についてのすべてのためのjava.util.zip
パッケージを見てください。
http://java.sun.com/developer/technicalArticles/Programming/圧縮/ の
あなたのイメージのまったく同じ品質を維持しながら、けれどもJPEGとPNGが既に何らかの形でInflater
クラスを使用して、圧縮されている、あなたはバイト数を減らすことができます。すでに圧縮形式を圧縮すると、一般的に重要ではありません。一緒にあなたのグループいくつかの画像ならば(インフレ技術は繰り返しを削減するオブジェクトデータ、共通のパターンを認識し、したがって、バイト数を減らすため)、しかし、それらを膨らませることは重要である。