System.DrawingでJPEG画像が元のビットマップよりも大きくなるのはなぜですか?
-
05-07-2019 - |
質問
奇妙な問題があります-約1,450万個のビットマップ画像がありますが、それらはおそらく圧縮されていません。これらのビットマップを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
解決
おそらく、保存しているjpeg画像が24ビットRGBカラー画像であり、ビットマップは1 bppの白黒画像であるためです。
ビットマップが1 bppの場合、jpegはおそらく変換するのに最適な形式ではありません。
他のヒント
白黒またはグレースケール?
http://www.faqs.org/faqsから/compression-faq/part2/section-6.html :
" JPEGは、フルカラーまたはグレースケールの画像で機能します。それは処理しません 少なくとも2層(白黒)画像。扱いません カラーマップされた画像。それらを事前に展開してマップされていない フルカラー表現。 JPEGは、「連続トーン」で最適に機能します。画像。 色の値の突然のジャンプが多い画像はうまく圧縮されません。"
エンコーダの属性を設定して、使用する圧縮レベルを通知する必要があります。
参照
このBitmap.Saveのオーバーロードを使用するように切り替えます。 a>。 EncoderParameter を指定できます。
ファイルが大きくなっている理由については、BMPがランレングスエンコードされているか、より小さな(24ビットではない)ビットマップを使用している可能性があります。
2色の61x64画像のサイズの比較:
- Fax-4 tiff:268バイト
- 2色bmp(上記):550バイト
- 8ビットjpeg:1502バイト
- 32ビットjpeg(System.Drawingは create):2015バイト
したがって、jpegを使用する必要がある場合は、最初に8ビットに変換します。 .Netでこれを行うのは厄介ですが、CodeProjectなどで利用可能なサンプルコードがあります。
私のソリューションをフォローアップしたかっただけです。システムの残りの部分でPNG形式のグラフィックスをサポートできるようになったので、ビットマップをPNGグラフィックスに変換し、1ピクセルあたり1ビットの白黒にしました。これにより、サイズが小さく効率的になりました。
問題は、JPGでは数色の画像が上手くいかないことでした。
洞察については、こちら(方法:JPEG圧縮レベルを設定する)をご覧ください。および例、ImageCodecInfoおよびEncoderParametersがキーです
考えてみてください。システムの一部がJPEGファイルである必要があると言います。それは本当に本当ですか、またはファイルにJPG拡張子が付いているだけでいいですか? もしそうなら、あなたのケースのBMPファイルが小さいので、あなたは-それはalthoughいですが-ファイル拡張子の名前を変更するだけです。
たとえば、Windowsでは、BMPファイルを取得して拡張子をJPGに変更できます。これを開くと、Windowsは気にしなくて適切に表示します。
このKB記事は、その方法を示しているはずです