SDK-MFC 備忘録 |
Windows SDKやMFCに関するメモです。
(記載内容について正しいことを保証するものではありません。MSDN等で確認してください)
2010/7/9 作成
WindowsのDIB形式のbitmapはメモリデバイスとして便利につかえます。
特にmfcではCImageクラスでラップするとあまり面倒ことを考えずに処理できます。
しかしながら、用意されたAPIだけでは処理できずにPixcelビットを直接操作したいことがあります。このときいくつかの注意点があります。
その1)ラスターの並び方向
DIB形式ではOS2の名残でラスターが下から上に並びます。これはヘッダ部(BIMAPINFO/BITMAPFILEHEADER)のbiHeightの符号で決まります。ラスターが上から下(トップダウン)の場合はbiHeightデータがマイナスとなります。
その2)Pixelビットサイズ
Pixcelビットを格納するメモリのサイズは常にラスター単位で4の整数倍になります。これもカラービット単位で考えると結構面倒な気がしますが、次の式を計算すれば全体のサイズ(BYTE単位)を求めることができます。
UINT size = ((((biWidth * biBitCount) + 31) & ~31) >> 3) * biHeight;
ラスター単位で4で割って余りがあれば切り上げて。。なんて計算が一発で出来ます。知っていると便利です。
ただし、先のラスター方向があるのでbiHeightは絶対値で計算するの忘れないように。。