2011-01-27 11 views
1

ImageFormat.Bmpという形式でBitmap.Saveメソッドを使用すると、ファイル内のビットマップヘッダー情報がbiSizeImageフィールドにゼロであることがわかります。ビットマップをファイルに保存すると画像サイズフィールドがゼロになる

これは仕様によればOKですが、残念なことに、私は正しく設定されていることを主張して作業することを余儀なくされています。

ビットマップの保存時にこのヘッダー情報フィールドを常に設定する方法はどうですか?

答えて

3

疑問に思うように、0はRGBビットマップのイメージサイズフィールドの完全な許容値です。

biSizeImage
画像のバイト単位のサイズ、:BITMAPINFOHEADER構造用MSDN documentationは、この事実を確認します。 BI_RGBビットマップの場合、これはゼロに設定されます。

biCompressionBI_JPEG又はBI_PNG場合、biSizeImageは、それぞれ、JPEGやPNG画像バッファのサイズを示します。

.NET Frameworkの実装は、単に標準的な、文書化された方法を実行しています。他に何かが必要な場合は、自分でファイル保存プロセスを処理する必要があります。BITMAPINFOHEADER構造体のbiSizeImageメンバーを手動で変更することができます。

非常に包括的な例がここにあります:Saving a Control Image to a Bitmap File。もちろん、Compact Frameworkのために書かれていますが、個々のコンポーネントのほとんどはまだ適用可能です。 Windows APIからいくつかの関数をP/Invokeする必要があり(定義についてはwww.pinvoke.netを参照)、DCで作業する必要があります。

GDI +ではなくGDIサブシステムを使用しているため、自分の手で図面を撮る方が高速になるでしょう。その一般的なアプローチに関する記事は1bpp in C#であり、BITMAPINFOHEADER構造体を使って自分の手で問題を解決することが実証されているようです。

アンマネージドC++コードを理解している場合は、同じことを行うためにC#で実装する必要があるものをいくつか考えてください。Loading and Saving Bitmaps。ご覧のとおり、実際に必要なコードは、1行のBitmap.Saveメソッドよりも長くても、それほど長くはありません。

+0

おかげで、私はピンボケを避けることを望んでいましたが、それは唯一の方法のようです。 – user380689

+0

@ user380689:他の方法はわかりません。私は問題は、あなたが指摘しているように、0は 'biSaveImage'メンバーの*期待値です。 'BITMAPINFOHEADER'構造体の[MSDN documentation](http://msdn.microsoft.com/en-us/library/dd183376.aspx)は、これを確認しています。「これはBI_RGBビットマップではゼロに設定されている可能性があります。実際には、定数「BI_RGB」の値は0です。.NET Frameworkは標準的な方法で文書化しています。あなたが何か他のものを必要とするならば、あなたは自分の手に物事を取らなければならないでしょう。 –

関連する問題