3

私は奇妙な問題を抱えています-私は約1450万のビットマップ画像を持っていますが、それはおそらく非圧縮です。これらのビットマップをJPGに変換し、データベースに保存する必要があります。

.NET System.Drawingライブラリで提供されているクラスを使用してビットマップをImageFormat.Jpegとして保存すると、結果のJPEGは元のビットマップの約2倍のサイズになります。コードは次のとおりです。

byte[] bitmapBytes = //get from the db
using(MemoryStream bitmapStream = new MemoryStream(bitmapBytes))
{
   using(Bitmap bitmap = (Bitmap)Bitmap.FromStream(bitmapStream))
   {
       bitmap.Save("jpg.jpg", ImageFormat.Jpeg);
   }
}

これらの画像のいくつかのHEXを調べましたが、圧縮設定が「なし」のようです。だから私はそれらが非圧縮であると仮定しています。さらに、元のファイルのHEXには「BMP」コードが含まれ、結果のファイルには予想どおり「JFIF」コードが含まれます。

画像は白黒で、色はありません。

なぜこれが起こるのかについて何か考えはありますか?正しい方向へのポインタを探しています...

編集:

  • 品質を指定できる代替のオーバーロードを使用して保存してみました。メリットは見られません。
  • また、ここである程度JPEGにこだわっていることを指定する必要があります。これはレガシーシステムであり、システムの他の部分はJPEGを想定しています。

画像属性:

  • ビットマップのサイズ:152x48
  • ビットマップファイルサイズ:1022バイト
  • JPEG:同じ寸法
  • JPEGサイズ:2.2 kb
  • ビットマップ情報:インデックス付き、1レイヤー(2色)
  • ビットマップ解像度:96.012x 96.012 ppi
4

8 に答える 8

6

これはおそらく、保存している jpeg 画像が 24 ビット RGB カラー画像であり、ビットマップが 1 bpp の白黒画像であるためです。

ビットマップが 1 bpp の場合、jpeg はおそらく最適な変換形式ではありません。

于 2009-05-05T15:45:46.420 に答える
5

白黒またはグレースケール?

http://www.faqs.org/faqs/compression-faq/part2/section-6.htmlから:

「JPEGはフルカラーまたはグレースケールの画像のいずれかで機能します。少なくとも2レベル(白黒)の画像は処理しません。カラーマップされた画像も処理しません。マップされていない画像に事前に展開する必要があります。フルカラー表現。JPEGは「連続トーン」画像に最適です。カラー値の急激な変化が多い画像は、十分に圧縮されません。」

于 2009-05-05T15:59:38.760 に答える
4

使用する圧縮レベルをエンコーダーに指示するには、エンコーダーの属性を設定する必要があります。

も参照してください

于 2009-05-05T15:43:30.933 に答える
2

この Bitmap.Save のオーバーロードを使用するように切り替えて、 EncoderParameterを指定できるようにします。

ファイルが大きくなっている理由については、BMP がランレングス エンコードされているか、より小さい (24 ビットではない) ビットマップを使用している可能性があります。

于 2009-05-05T15:44:23.740 に答える
2

2 色の 61x64 画像のサイズの比較:

  • Fax-4 tiff: 268 バイト
  • 2 色 bmp (上記と同様): 550 バイト
  • 8 ビット jpeg: 1502 バイト
  • 32 ビット jpeg (System.Drawing が作成するため): 2015 バイト

したがって、JPEG を使用する必要がある場合は、まず 8 ビットに変換してください。.Net でこれを行うのは面倒ですが、CodeProject などでサンプル コードを入手できます。

于 2009-05-05T18:19:11.450 に答える
1

私のソリューションをフォローアップしたかっただけです。システムの残りの部分で PNG 形式のグラフィックをサポートすることができたので、ビットマップを PNG グラフィックに変換し、ピクセルあたり 1 ビットの白黒にしました。これにより、それらは小さく効率的になりました。

問題は、JPG では色数の少ない画像をうまく処理できないことでした。

于 2009-05-07T20:23:19.480 に答える
0

いくつかの洞察と例については、ここ(方法:JPEG圧縮レベルの設定)を確認してください。ImageCodecInfoとEncoderParametersが重要です

于 2009-05-05T15:44:02.167 に答える
0

考えてみてください: あなたのシステムの一部は、ファイルが JPEG ファイルである必要があると言います。それは本当に本当ですか、それともファイルに JPG 拡張子が必要なだけですか? もしそうなら、あなたの場合のBMPファイルは小さいので、醜いですが、ファイル拡張子の名前を変更するだけです。

たとえば、Windows では、BMP ファイルを取得してその拡張子を JPG に変更することができます。それを開くと、Windows は気にせず、適切に表示します。

于 2009-05-05T18:29:14.407 に答える