Bitmap.Save メソッドをフォーマット ImageFormat.Bmp で使用すると、ファイルのビットマップ ヘッダー情報で biSizeImage フィールドがゼロになることがわかりました。
私が見たところ、これは仕様によれば問題ありませんが、残念ながら、私が使用することを余儀なくされている安っぽい組み込みデバイスは、正しく設定されていることを主張しています。
問題は、ビットマップが保存されるときにこのヘッダー情報フィールドを常に設定する方法です。
Bitmap.Save メソッドをフォーマット ImageFormat.Bmp で使用すると、ファイルのビットマップ ヘッダー情報で biSizeImage フィールドがゼロになることがわかりました。
私が見たところ、これは仕様によれば問題ありませんが、残念ながら、私が使用することを余儀なくされている安っぽい組み込みデバイスは、正しく設定されていることを主張しています。
問題は、ビットマップが保存されるときにこのヘッダー情報フィールドを常に設定する方法です。
ご想像のとおり、問題は、0 が RGB ビットマップのイメージ サイズ フィールドに完全に許容される値であることです。構造に関するMSDN ドキュメントは、BITMAPINFOHEADER
この事実を確認しています。
biSizeImage
イメージのバイト単位のサイズ。これは、ビットマップの場合はゼロに設定できますBI_RGB
。
biCompression
がBI_JPEG
またはの場合、それぞれ JPEG または PNG 画像バッファのサイズを示しますBI_PNG
。biSizeImage
したがって、.NET Framework での実装は、文書化された標準的な方法で処理を行うだけです。他に何かが必要なため、ファイルへの保存プロセスを自分で処理する必要があります。これにより、構造体のbiSizeImage
メンバーを手動で変更できます。BITMAPINFOHEADER
かなり包括的な例がここにあります: Saving a Control Image to a Bitmap File . もちろん、Compact Framework 用に書かれていますが、個々のコンポーネントのほとんどは適用可能です。Windows API からいくつかの関数を P/Invoke し (定義についてはwww.pinvoke.netにアクセスしてください)、DC を操作する必要があります。
GDI+ ではなく GDI サブシステムを使用しているため、描画を自分の手で行う方がおそらく高速です。その一般的なアプローチに関する記事は、ここから入手できます: C# の 1bpp で、構造体を使用して問題を自分の手に委ねることも示してBITMAPINFOHEADER
いるようです。
アンマネージ C++ コードを理解している場合は、同じことを行うために C# で何を実装する必要があるかを理解できるチュートリアルがここにあります: Loading and Saving Bitmaps . ご覧のとおり、必要なコードは実際にはそれほど長くはありませんが、まだ 1 行のBitmap.Save
メソッドではありません。