就是选取颜色相近的区域,再显示出来。
连续的可能要递归,不连续的全图扫描,我的程序就是逐点判断颜色是否相近,是则加入到区域中,结果是功能正确,但速度太慢,而且递归运算时,次数太多就会报堆栈溢出(递归也是逐点扫描,不过不是全图,而是从基点扩散),不知是为什么。
请问我的基本想法是否正确,即实现这样的功能是不是应该有这样一个流程?
连续的可能要递归,不连续的全图扫描,我的程序就是逐点判断颜色是否相近,是则加入到区域中,结果是功能正确,但速度太慢,而且递归运算时,次数太多就会报堆栈溢出(递归也是逐点扫描,不过不是全图,而是从基点扩散),不知是为什么。
请问我的基本想法是否正确,即实现这样的功能是不是应该有这样一个流程?
解决方案 »
- 发现#define一个很有趣的现象,来分享下。
- 接收到的写符写入txt的出现乱码的问题(我会及时结贴)
- 关于文件系统监控
- 如何在程序中实现鼠标左键单击listctrl中的哪个单元格
- 心情不好,散分给大家~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- 抓取窗口句柄问题。
- 怎么不能和数据库连接???
- [公告]:取消maoxianwang (大大㊣BETAⅡ //楼主,请把分给猪) VC/MFC ATL/ActiveX/COM版面版主职务
- 请各位大虾指教
- ●●一个语法问题∶为什么在switch语句的case分句里不允许定义变量?●●
- 请问:在activex里如何设置定时器???
- 如何设定录音时的来源是麦克风还是混音或Line in ?
COLORREF color;
Byte r;
Byte g;
Byte b;void DealLink
(
BITMAP bmp,
long X,
long Y,
byte Diff,
HRGN hrgn
);HRGN GetMagicRGN
(
BITMAP bmp,
unsigned long X,
unsigned long Y,
Byte Diff,
bool bLink
)
{
HRGN hrgn=CreateRectRgn(0,0,0,0);
color=0;
int nPitch0=((bmp.bmWidth*bmp.bmBitsPixel+31)/32)*4;
memcpy(&color,(BYTE*)bmp.bmBits+(X*3+nPitch0*(bmp.bmHeight-1-Y)),3);
memcpy(&r,&color,1);
memcpy(&g,(char *)&color+1,1);
memcpy(&b,(char *)&color+2,1);
if(bLink)
DealLink(bmp,X,Y,Diff,hrgn);
else
{
for(int j=0;j<bmp.bmHeight;j++)
{
BYTE* Bits0=(BYTE*)bmp.bmBits+nPitch0*(bmp.bmHeight-1-j);
for(int i=0;i<bmp.bmWidth;i++)
{
union
{
COLORREF col;
struct
{
Byte rr;
Byte gg;
Byte bb;
Byte nn;
};
};
col=0;
memcpy(&col,Bits0,3);
if((abs(rr-r)<Diff) && (abs(gg-g)<Diff) && (abs(bb-b)<Diff))
{
//颜色相近
HRGN h=CreateRectRgn(i,j,i+1,j+1);
CombineRgn(hrgn,hrgn,h,RGN_OR);
DeleteObject(h);
}
Bits0+=3;
}
}
}
return hrgn;
}
void DealLink
(
BITMAP bmp,
long X,
long Y,
byte Diff,
HRGN hrgn
)
{
if((X<0) || (Y<0) || (X>=bmp.bmWidth) || (Y>=bmp.bmHeight) || PtInRegion(hrgn,X,Y))
return;
union
{
COLORREF col;
struct
{
Byte rr;
Byte gg;
Byte bb;
Byte nn;
};
};
int nPitch0=((bmp.bmWidth*bmp.bmBitsPixel+31)/32)*4;
memcpy(&col,(BYTE*)bmp.bmBits+(X*3+nPitch0*(bmp.bmHeight-1-Y)),3);
if((abs(rr-r)<Diff) && (abs(gg-g)<Diff) && (abs(bb-b)<Diff))
{
//颜色相近
HRGN h=CreateRectRgn(X,Y,X+1,Y+1);//堆栈溢出时停在这一行
CombineRgn(hrgn,hrgn,h,RGN_OR);
DeleteObject(h);
}
else
return;
DealLink(bmp,X+1,Y,Diff,hrgn);
DealLink(bmp,X-1,Y,Diff,hrgn);
DealLink(bmp,X,Y+1,Diff,hrgn);
DealLink(bmp,X,Y-1,Diff,hrgn);
}
http://www.dev-club.com/club/bbs/ShowAnnounce.asp?ID=2144469