質問

奇妙な問題があります-約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ファイルである必要があると言います。それは本当に本当ですか、またはファイルにJPG拡張子が付いているだけでいいですか? もしそうなら、あなたのケースのBMPファイルが小さいので、あなたは-それはalthoughいですが-ファイル拡張子の名前を変更するだけです。

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

このKB記事は、その方法を示しているはずです

http://support.microsoft.com/kb/324790

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top