画像のネガ変換(高速版)

解説


   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;
}

カテゴリー「VC++ TIPS」 のエントリー