就是选取颜色相近的区域,再显示出来。
连续的可能要递归,不连续的全图扫描,我的程序就是逐点判断颜色是否相近,是则加入到区域中,结果是功能正确,但速度太慢,而且递归运算时,次数太多就会报堆栈溢出(递归也是逐点扫描,不过不是全图,而是从基点扩散),不知是为什么。
请问我的基本想法是否正确,即实现这样的功能是不是应该有这样一个流程?

解决方案 »

  1.   

    就是这样做的。程序如下,在cb下调试的
    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);
    }
      

  2.   

    不要使用递归调用,使用数组来代替栈比较好。而且标准的填充算法是很慢的。使用快速的腐蚀填充效果比较好可以参考我的dev-club上的贴子,不过代码是VB的。
    http://www.dev-club.com/club/bbs/ShowAnnounce.asp?ID=2144469