void CtestprintDlg::workpic(CString filename)
{
CImage m_image;
m_image.Load(filename);
int nBPP_image;
nBPP_image=m_image.GetBPP();
int arr[130][53]={0};
int first = 1;
int px,py;
//往左扫描
for (int y=0;y<53;y++)
{
for (int x=0;x<130;x++)
{
bool bEqual;
byte r[8],g[8],b[8],avg[8];
if (nBPP_image==24)
{
{//向→看
BYTE* target =(BYTE*)m_image.GetPixelAddress(x,y);r[0] = *(target+0); g[0] = *(target+1); b[0] = *(target+2);
avg[0] = (r[0] + g[0] + b[0]) /3;
if (avg[0]>200)
{
m_image.SetPixelRGB(x,y,255,255,255);
arr[x][y]=0;
} else
{
if(first == 1)
{
px = x;
py = y+3;
//m_image.SetPixelRGB(x,y,255,0,255);
first = 2;
}
m_image.SetPixelRGB(x,y,0,0,0);
arr[x][y]=1;
}
}
}
}
}
GetLetter(m_image,px,py);
// N_image.Save("N.jpg");
m_image.Save(_T("testprintDlg.bmp"));
}
void CtestprintDlg::Rotate(CImage &myImage1 )
{
//程序编制:李立宗 lilizong@gmail.com
//2012-8-5
CImage myImage2;
if(myImage1.IsNull())
return ;
if(myImage2.IsNull()){
myImage2.Create(myImage1.GetWidth(),myImage1.GetHeight(),24,0);
}
COLORREF pixel;
int maxY = myImage1.GetHeight();
int maxX=myImage1.GetWidth();
byte* pRealData;
byte* pRealData2;
pRealData=(byte*)myImage1.GetBits();
pRealData2=(byte*)myImage2.GetBits();
int pit=myImage1.GetPitch();
int pit2=myImage2.GetPitch();
int bitCount=myImage1.GetBPP()/8;
int bitCount2=myImage2.GetBPP()/8;
int tempR,tempG,tempB;
float const1,const2;
float fCosa=cos(-30*3.14/180);
float fSina=sin(-30*3.14/180);
const1=(float)(-0.5*(maxX-1)*fCosa-0.5*(maxY-1)*fSina+0.5*(maxX-1));
const2=(float)(0.5*(maxX-1)*fSina-0.5*(maxY-1)*fCosa+0.5*(maxY-1));
int tempX,tempY;
//说明:将生产的图像作为24位图处理。
for (int y=0; y<maxY; y++) {
for (int x=0; x<maxX; x++) {
tempY=-(float)x*fSina+(float)y*fCosa+const2+0.5;
tempX=(float)x*fCosa+(float)y*fSina+const1+0.5;
if(tempY>=0&&tempY+2<=maxY&&tempX>=0&&tempX+2<=maxX)
{
tempR=(int)(int)(*(pRealData+pit*tempY+tempX*bitCount));
if(bitCount==1)
{tempG=tempR;
tempB=tempR;}
else
{
tempG=(int)(int)(*(pRealData+pit*tempY+tempX*bitCount+1));
tempB=(int)(int)(*(pRealData+pit*tempY+tempX*bitCount+2));
tempG=0;
tempB=0;
}
}
else
{
tempR=0;
tempG=0;
tempB=0;
}
*(pRealData2+pit2*y+x*bitCount2)=tempR;
*(pRealData2+pit2*y+x*bitCount2+1)=tempG;
*(pRealData2+pit2*y+x*bitCount2+2)=tempB;
}
}
myImage2.Save(_T("N.jpg"));
}
void CtestprintDlg::OnBnClickedOk()
{
workpic(_T("captcha.bmp"));
return ;
}
void CtestprintDlg::GetLetter(CImage &image,int px,int py)
{
int StackPoint =1;
//当前像素位置
int iCurrentPixelx = px;
int iCurrentPixely = py;
byte r[8],g[8],b[8],avg[8];
if(iCurrentPixelx > 0)
{
BYTE* target =(BYTE*)image.GetPixelAddress(iCurrentPixelx-1,iCurrentPixely);r[0] = *(target+0); g[0] = *(target+1); b[0] = *(target+2);
avg[0] = (r[0] + g[0] + b[0]) /3;
if (avg[0]>200)
{
char p[16]="";
sprintf(p,"%d|%d",iCurrentPixelx - 1,iCurrentPixely);
mapPoint.insert(make_pair(p,1));
}
}
if(iCurrentPixely < 52)
{
BYTE* target =(BYTE*)image.GetPixelAddress(iCurrentPixelx,iCurrentPixely+1);r[0] = *(target+0); g[0] = *(target+1); b[0] = *(target+2);
avg[0] = (r[0] + g[0] + b[0]) /3;
if (avg[0]>200)
{
char p[16]="";
sprintf(p,"%d|%d",iCurrentPixelx ,iCurrentPixely+1);
mapPoint.insert(make_pair(p,1));
}
}
if(iCurrentPixelx < 129)
{
BYTE* target =(BYTE*)image.GetPixelAddress(iCurrentPixelx+1,iCurrentPixely);r[0] = *(target+0); g[0] = *(target+1); b[0] = *(target+2);
avg[0] = (r[0] + g[0] + b[0]) /3;
if (avg[0]>200)
{
char p[16]="";
sprintf(p,"%d|%d",iCurrentPixelx + 1,iCurrentPixely);
mapPoint.insert(make_pair(p,1));
}
}
if(iCurrentPixely > 0 )
{
BYTE* target =(BYTE*)image.GetPixelAddress(iCurrentPixelx,iCurrentPixely-1);r[0] = *(target+0); g[0] = *(target+1); b[0] = *(target+2);
avg[0] = (r[0] + g[0] + b[0]) /3;
if (avg[0]>200)
{
char p[16]="";
sprintf(p,"%d|%d",iCurrentPixelx ,iCurrentPixely-1);
mapPoint.insert(make_pair(p,1));
}
}
while(1)
{
int size = 0;
for(std::map<string,int>::iterator iter = mapPoint.begin(); iter != mapPoint.end();iter++)
{
if(iter->second == 1)
{
size ++;
}
}
if(size == 0)
{
break;
}
for(std::map<string,int>::iterator iter = mapPoint.begin(); iter != mapPoint.end();iter++)
{
if(iter->second == 1)
{
char po[16] = "";
strcpy(po,(iter->first).c_str());
char * f = strtok(po,"|");
char * t = strtok(NULL,"|");
iCurrentPixelx = atoi(f);
iCurrentPixely = atoi(t);
iter->second = 2;
image.SetPixelRGB(iCurrentPixelx,iCurrentPixely,255,0,255);
if(iCurrentPixelx > 0)
{
BYTE* target =(BYTE*)image.GetPixelAddress(iCurrentPixelx-1,iCurrentPixely);r[0] = *(target+0); g[0] = *(target+1); b[0] = *(target+2);
avg[0] = (r[0] + g[0] + b[0]) /3;
if (avg[0]>200)
{
char * p = new char[16];
sprintf(p,"%d|%d",iCurrentPixelx - 1,iCurrentPixely);
mapPoint.insert(make_pair(p,1));
}
}
if(iCurrentPixely < 52)
{
BYTE* target =(BYTE*)image.GetPixelAddress(iCurrentPixelx,iCurrentPixely+1);r[0] = *(target+0); g[0] = *(target+1); b[0] = *(target+2);
avg[0] = (r[0] + g[0] + b[0]) /3;
if (avg[0]>200)
{
char * p = new char[16];
sprintf(p,"%d|%d",iCurrentPixelx ,iCurrentPixely+1);
mapPoint.insert(make_pair(p,1));
}
}
if(iCurrentPixelx < 129)
{
BYTE* target =(BYTE*)image.GetPixelAddress(iCurrentPixelx+1,iCurrentPixely);r[0] = *(target+0); g[0] = *(target+1); b[0] = *(target+2);
avg[0] = (r[0] + g[0] + b[0]) /3;
if (avg[0]>200)
{
char * p = new char[16];
sprintf(p,"%d|%d",iCurrentPixelx + 1,iCurrentPixely);
mapPoint.insert(make_pair(p,1));
}
}
if(iCurrentPixely > 0 )
{
BYTE* target =(BYTE*)image.GetPixelAddress(iCurrentPixelx,iCurrentPixely-1);r[0] = *(target+0); g[0] = *(target+1); b[0] = *(target+2);
avg[0] = (r[0] + g[0] + b[0]) /3;
if (avg[0]>200)
{
char * p = new char[16];
sprintf(p,"%d|%d",iCurrentPixelx ,iCurrentPixely-1);
mapPoint.insert(make_pair(p,1));
}
}
}
}
}
std::map<string,int>::iterator iter = mapPoint.begin();
int pos = iter->first.find("|");
int posx = atoi(iter->first.substr(0,pos).c_str());
int posy = atoi(iter->first.substr(pos+1,iter->first.length()-pos).c_str());
int minx = posx;
int maxx = 0;
int miny = posy;
int maxy = 0;
for(; iter != mapPoint.end();iter++)
{
int pos = iter->first.find("|");
int posx = atoi(iter->first.substr(0,pos).c_str());
int posy = atoi(iter->first.substr(pos+1,iter->first.length()-pos).c_str());
if(posx<minx)
minx = posx;
if(posx>maxx)
maxx = posx;
if(posy<miny)
miny = posy;
if(posy>maxy)
maxy = posy;
}
int width = maxx-minx;
int height = maxy-miny;
CImage N_image;
N_image.Create(width+10,height+10,24);
for(std::map<string,int>::iterator iter = mapPoint.begin(); iter != mapPoint.end();iter++)
{
int pos = iter->first.find("|");
int posx = atoi(iter->first.substr(0,pos).c_str());
int posy = atoi(iter->first.substr(pos+1,iter->first.length()-pos).c_str());
N_image.SetPixelRGB(posx-minx+5,posy-miny+5,255,255,255);
}
Rotate(N_image);
}
qq验证码识别
最新推荐文章于 2025-04-03 18:23:19 发布