SBitmapEx クラス

ビットマップ管理機能を提供します。カラー数の変更、拡大縮小、サイズの変更、ぼかし等の機能を提供します。
更新日 2014-07-29

仕様

内部にDIBSection ラップしたクラスです。画像を任意のDC(デバイスコンテキスト)に出力できます。各種エフェクト用 メソッドもあります。SData クラスにbmpファイルをロードして、直接入出力できます。一部のメソッドはMMX に対応して います。

ソースコード

sbitmapex.h 右クリックで「対象をファイルに保存」でダウンロードしてください。

依存関係

sdata.hscritical.hsjstring.hも使用してます。同じフォルダに入れておいてね。

メソッド

CreateNullBitmap()

ビットマップを作成します。DIBSection を作成する際にHDC を必要とします(HWND でも可)。任意のサイズ、カラービット数で作成できます。初期の 背景色も指定できます。
RECT rect = { 0, 0, 640, 480 };
SBitmapEx bmp;
BOOL bRet = bmp.CreateNullBitmap(hDC, &rect, 32, RGB(255,0,0));

IsBitmap()

ビットマップが構築されていればTRUE を返します。
BOOL bRet = bmp.IsBitmap();

GetColorCount(), GetColorBits()

ビットマップのカラー数(もしくはビット数) を返します。
int nCount = bmp.GetColorCount();
// nCount == 2 or 256 or 16777216

int nBits = bmp.GetColorBits();
// nBits == 2 or 8 or 24 or 32(bit)

GetBitmapRect(), GetBitmapWidth(), GetBitmapHeight()

ビットマップのサイズ(RECT構造体 もしくは幅、高さ) を取得できます。
RECT rect = { 0, 0, 0, 0 };
bmp.GetBitmapRect(&rect);

Import(), Export()

SData クラスと相互に変換するメソッドです。SData に格納されるバイナリストリームはファイルの落とせるビットマップデータそのものです。
SData data;
data.Load( "d:\test.bmp" );

SBitmapEx bmp;
bmp.Import( hWnd, data);	// ビットマップを入力

data.Free();				// データをクリアしておく

bmp.Export( data );			// ビットマップを出力
data.Save( "d:\test_new.bmp" );

ImportClipboard(), ExportClipboard()

クリップボード経由でビットマップデータをやり取りできます。例えばペイントで選択してコピーしたデータをSBitmapEx として構築できます。
// クリップボードに存在するビットマップを読み込み
bmp.ImportClipboard(hWnd);

bmp.ExportClipboard(hWnd);
// クリップボードにビットマップを書き出し

ImportPalette(), SetPalette(), GetPalette(), GetNearPaletteIndex()

別のSBitmapEx インスタンスからパレットデータをコピーしたり、パレットテーブルの指定の個所のRGB値を 取得(もしくは設定)できます。GetNearPaletteIndex() は指定したRGB にもっとも近似するパレットのインデックス を返します。
SBitmpaEx bmp0, bmp1;
bmp0.Import(hWnd, data);	// 256 色のビットマップをImport

RECT rect = { 0, 0, 320, 240 };
bmp1.CreateNullBitmap(hWnd, &rect, 8, RGB(0,0,0));
bmp1.ImportPalette( bmp0 );
// bmp1 のパレットテーブルはbmp0 のそれと同じに設定されています。

int nIndex = bmp1.GetNearPaletteIndex( RGB(255, 127, 39));
// RGB(255, 127, 39) に近似するパレットインデックスを返します。

bmp1.SetPalette(10, RGB(0, 128, 64);
// 10番目のパレットにRGB(0, 128, 64) という値を設定する。

COLORREF crColor = bmp1.GetPalette(11);
// 11番目のパレット値を取得する。

Draw()

任意のDCに描きます。bmpRect をdcRect に書き出すので、その際任意にサイズ調整されます。 またdcRect との差が空いた場合、そこを塗り潰す背景色も指定できます。 これでWM_ERASEBKGND を用いずに済み、チラツキを抑えた実装が出来ます。
RECT clRect;
::GetClientRect(&clRect);
RECT dcRect, bmpRect;
bmp.GetBitmapRect(&bmpRect);
::CopyRect(&dcRect, &bmpRect);
bmp.Draw(hDC, &clRect, &dcRect, &bmpRect );

Spin()

画像の中心を軸に任意の角度だけ回転できます。キャンバスサイズの変更の有無、その際の背景色(もしくは透過)を指定できます。透過指定された ピクセルはPast() を実行する時に評価されます。
bmp.Spin(90);	// 90度回転

SBitmapEx tmp;
bmp.Spin(tmp, 112, RGB(255,0,0), TRUE, FALSE);	
// 112度回転して別のSBitmapEx インスタンスtmp にコピー。
// 背景色はRGB(255, 0, 0)、キャンバスサイズの変更を許可、
// 背景部を透過指定しない。

ToGrayScale()

グレースケール(モノクロ)処理を施します。256, 16, 2 階調の三種類が可能です。ビットカラーを8以下に指定した場合、パレットベースの ビットマップになります。
bmp.ToGrayScale(8);		// 256 階調グレースケール化

softness()

画像をボカします。処理のレベルを指定できます。
bmp.Softness();

Paste()

SBitmapEx の画像に別のSBitmapEx を貼り付けます。マスクカラーを与えると、その色の ピクセルは無視されます。またSetPixelBlendValue() やFillPixelBelndValueを使ってピクセル毎の透明度を設定する 事ができます。
COLORREF maskColor[] = { RGB(255, 0, 0) };
bmp.Paste( other, 40, 30, maskColor, sizeof(maskColor)/sizeof(COLORREF));

SetPixel(), GetPixel()

ピクセル毎にCOLORREF 値(RGB) を設定する事ができます。
bmp.SetPixel( RGB(255,0,0), x, y);
COLORREF crColor = bmp.GetPixel(x, y);

FillPixel()

指定範囲を塗りつぶします。
RECT rect = { 30, 30, 100, 100 };
bmp.FillPixel( &rect, RGB(0,256,0));

SetPixelBlendValue(), GetPixelBlendValue()

透明度をピクセル毎に255段階で設定できます。設定された透明度はPaste() メソッド実行時に参照されます。 透明度が255 の時は100% 透過します。透明度は貼り付ける画像側に設定します。
other.SetPixelBlendValue( 128, x, y);
bmp.Paste(other, 0, 0 );

FillPixelBlendValue()

透明度を指定の範囲、もしくは全面に割り当てる事ができます。
RECT rect = { 30, 30, 100, 100 };
otehr.FillPixelBlendValue( &rect, 128);

ResizeCanvas()

キャンバスサイズを変更します。画像自体は縮小や拡大されるものではありません。余白が生まれた場合の 背景色も設定できます。
RECT rect = { 0, 0, 1024, 768 };
bmp.ResizeCanvas(&rect, RGB(255,255,255));

ResizeBitmap()

ビットマップ自体を拡大・縮小します。
RECT rect;
bmp.GetBitmapRect(&rect);

rect.right *= 2;
rect.bottom /= 3;
bmp.ResizeBitmap(&rect);

ReverseX(), ReverseY()

上下・左右に反転します。
bmp.ReverseX();

Negative()

ネガポジ反転します。
bmp.Negative();