【C++】CImageクラスを使用してカラー画像を8ビットグレー画像に変換
1334 ワード
BOOL ImageToGray(CImage& imgSrc,CImage& imgDst)
{
int width = imgSrc.GetWidth();
int height = imgSrc.GetHeight();
if (!imgDst.IsNull())
{
imgDst.Destroy();
}
imgDst.Create(width,height,8,0);// imgSrc , 1
if(imgDst.IsNull())
return FALSE;
// imgDst 256
RGBQUAD ColorTab[256];
for(int i=0;i<256;i++)
{
ColorTab[i].rgbBlue = ColorTab[i].rgbGreen = ColorTab[i].rgbRed = i;
}
imgDst.SetColorTable(0,256,ColorTab);
byte* pDataSrc = (byte*)imgSrc.GetBits(); //
byte* pDataDst = (byte*)imgDst.GetBits();
int pitchSrc = imgSrc.GetPitch(); // +:top-down;-:bottom-up DIB
int pitchDst = imgDst.GetPitch();
int bitCountSrc = imgSrc.GetBPP()/8; //
int bitCountDst = imgDst.GetBPP()/8;
if((bitCountSrc!=3)||(bitCountDst!=1))
return FALSE;
int tmpR,tmpG,tmpB,avg;
for(int i=0;i<width;i++)
{
for(int j=0;j<height;j++)
{
tmpR = *(pDataSrc+pitchSrc*j+i*bitCountSrc);
tmpG = *(pDataSrc+pitchSrc*j+i*bitCountSrc+1);
tmpB = *(pDataSrc+pitchSrc*j+i*bitCountSrc+2);
avg = (int)(tmpR+tmpG+tmpB)/3;
*(pDataDst+pitchDst*j+i*bitCountDst) = avg;
}
}
return TRUE;
}