解説
RGBのカラー画像CBitmap m_cBitmapをネガ画像に変換する。
変換は単にRGBのそれぞれを反転するだけ、下記の式を使用。
出力画素(R) = 255 - R
出力画素(G) = 255 - G
出力画素(B) = 255 - B
当然ながら2回変換すればもとの色調の画像に戻る。
一定以上の大きさのビットマップに対してはこちらよりも
高速に動く。と言っても実際はさほど変わらないはず(速度未測定)。
高速化は変換テーブルとポインタの使用による。
//
// ネガポジ変換
//
bool CDIBitmap::InvertRGB(void)
{
int i;
int j;
int n;
int nDiff;
BITMAP sBitmap;
DWORD dwLineBytes;
DWORD dwSizeImage;
BYTE* lpBuffer;
BYTE* lpOriginal;
BYTE lpnTable[256];
n = 255; //色変換用テーブル作成
for(i = 0;i < 256; i++)
{
lpnTable[i] = n;
n--;
}
m_lpcBitmap->GetBitmap(&sBitmap);
dwSizeImage = (DWORD)(sBitmap.bmWidthBytes * sBitmap.bmHeight);
dwLineBytes = sBitmap.bmWidthBytes;
lpOriginal = new BYTE[dwSizeImage + 1];
m_lpcBitmap->GetBitmapBits(dwSizeImage,lpOriginal);
nDiff = dwLineBytes - (sBitmap.bmWidth << 1) - sBitmap.bmWidth; // = (dwLineBytes - sBitmap.bmWidth * 3)
lpBuffer = lpOriginal;
for(j = 0; j < sBitmap.bmHeight; j++)
{
for(i = 0;i < sBitmap.bmWidth; i++)
{
*lpBuffer = lpnTable[*lpBuffer];
lpBuffer++;
*lpBuffer = lpnTable[*lpBuffer];
lpBuffer++;
*lpBuffer = lpnTable[*lpBuffer];
lpBuffer++;
}
lpBuffer += nDiff; //ビットマップライン区切り差分バイト分だけポインタ移動
}
m_lpcBitmap->SetBitmapBits(dwSizeImage,lpOriginal); //CBitmapへの保存
delete lpOriginal;
return true;
}







