// DibImage.cpp: implementation of the CDibImage class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "DibImage.h"
#include <math.h>
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CDibImage::CDibImage()
{
}
CDibImage::~CDibImage()
{
}
CDib CDibImage::POINTVERT(CDib dib,int FA, int FB)
{
int width=dib.GetWidth(),
height=dib.GetHeight(),
rowlen=dib.GetRowLength();
int x,y;
for(y=0;y<height;y++)
{
for( x=0;x<width;x++)
{
dib.SetPixel(x,y,
FB-dib.GetRed((height - y - 1) * rowlen + x * 3),
FB-dib.GetGreen((height - y - 1) * rowlen + x * 3),
FA-dib.GetBlue((height - y - 1) * rowlen + x * 3));
}
}
return dib;
}
CDib CDibImage::FindComplex(CDib dib)
{
int width=dib.GetWidth(),
height=dib.GetHeight();
int x,y;
for(y=0;y<height;y++)
{
for( x=0;x<width;x++)
{
if(IsComplex(dib,x,y))
{
dib.SetPixel(x,y,0,0,0);
}
else
{
dib.SetPixel(x,y,255,255,255);
}
}
}
return dib;
}
BOOL CDibImage::IsComplex(CDib dib,int x,int y)
{
int nOffset;
BYTE R,G,B;
double r,g;
double Q0,Q1,W;
double au,bu,cu,ad,bd,cd;
//给常数赋值
au = -1.3767;
bu = 1.0743;
cu = 0.1452;
ad = -0.776;
bd = 0.5601;
cd = 0.1766;
//得到RGB值
nOffset = dib.GetPixelsOffset(x,y);
R = dib.GetRed(nOffset);
G = dib.GetGreen(nOffset);
B = dib.GetBlue(nOffset);
if(R+G+B==0)
{
return FALSE;
}
//将RGB转换成rgb
r = R*1.0/(R+G+B);
g = G*1.0/(R+G+B);
if(r<=0.2||r>=0.6)
{
return FALSE;
}
//判断是否为肤色的条件
Q0 = ad*r*r + bd * r + cd;
Q1 = au*r*r + bu * r + cu;
W = (r-0.33)*(r-0.33) + (g-0.33)*(g-0.33);
if(g<Q1&&g>Q0&&W>0.004)
{
return TRUE;
}
else
{
return FALSE;
}
}
CDib CDibImage::AddLight(CDib dib)
{
int width=dib.GetWidth(),
height=dib.GetHeight(),
rowlen=dib.GetRowLength();
int histogram[256]={0};
RGB rgb;
int x,y;
for(y=0;y<height;y++)
for( x=0;x<width;x++)
{
rgb.R=dib.GetRed(dib.GetPixelsOffset(x,y));
rgb.G=dib.GetGreen(dib.GetPixelsOffset(x,y));
rgb.B=dib.GetBlue(dib.GetPixelsOffset(x,y));
//计算灰度值
int gray=(rgb.R*299+rgb.G*587+rgb.B*114)/1000;
histogram[gray]++;
}
int sum=0,total=width*height,num;
for (int i=0;i<256;i++)
{
if ((float)sum/total<100)
{
sum+=histogram[255-i];
num=i;
}
else
break;
}
int averagegray=0,calnum=0;
for (int i=255;i>=255-i;i--)
{
averagegray+=histogram[i]*i;
calnum+=histogram[i];
}
if(calnum==0)
calnum= 0.1;
averagegray/=calnum;
float co=(float)(255.0/(float)averagegray);
for(y=0;y<height;y++)
for( x=0;x<width;x++)
{
rgb.R=int(dib.GetRed(dib.GetPixelsOffset(x,y))*co);
rgb.G=int(dib.GetGreen(dib.GetPixelsOffset(x,y))*co);
rgb.B=int(dib.GetBlue(dib.GetPixelsOffset(x,y))*co);
dib.SetPixel(x,y,
rgb.R>255?255:rgb.R,
rgb.G>255?255:rgb.G,
rgb.B>255?255:rgb.B);
}
return dib;
}
CDib CDibImage::AutoWhite(CDib dib)
{
int width=dib.GetWidth(),
height=dib.GetHeight(),
rowlen=dib.GetRowLength();
double cr=0,cg=0,cb=0;
double x1,x2;
int x,y;
for(y=0;y<height;y++)
{
for( x=0;x<width;x++)
{
cr+=dib.GetRed(dib.GetPixelsOffset(x,y));
cg+=dib.GetGreen(dib.GetPixelsOffset(x,y));
cb+=dib.GetBlue(dib.GetPixelsOffset(x,y));
}
}
x1=cr/cg,x2=cr/cb;
for(y=0;y<height;y++)
{
for( x=0;x<width;x++)
{
dib.SetPixel(x,y,
dib.GetRed(dib.GetPixelsOffset(x,y)),
dib.GetGreen(dib.GetPixelsOffset(x,y))*x1>255?255:(BYTE)(dib.GetGreen(dib.GetPixelsOffset(x,y))*x1),
dib.GetBlue(dib.GetPixelsOffse�