求图形外轮廓线的一个类

类别:编程语言 点击:0 评论:0 推荐:

用图形剪切了做软件界面是个常用的手段,算法也有很多,这个算做原创,非常简单,图形不是很复杂的情况下效率比较高(也是一般的情况)

.h

#ifndef _UtilClsH
#define _UtilClsH

#include <vcl.h>

//---------------------------------------------------------------------------
class UtilCls
{
public:
        static TPoint* ComputeOutline(TImage * image, TColor crKey, int& count);
protected:
private:
        static TPoint LocateFirstPoint(TImage * image, TColor crKey);
        static TPoint LocatePoint(TPoint curr, int& orgin, TImage * image, TColor crKey);
};
#endif

.cpp

#pragma hdrstop

#include "_UtilCls.h"

//---------------------------------------------------------------------------

#pragma package(smart_init)

TPoint UtilCls::LocateFirstPoint(TImage * image, TColor crKey)
{
        //TODO: Add your source code here
        int imgW,imgH;
        imgW = image->Width;
        imgH = image->Height;

        int w,h;
        for(h = (imgH>>1);h < imgH; h++)
        {
                for(w = 0; w < imgW; w++)
                {
                        if(image->Canvas->Pixels[w][h] != crKey)
                        {
                                return TPoint(w,h);
                        }
                }
        }
        int limit = imgH >>1;
        for(h = 0;h < limit; h++)
        {
                for(w = 0; w < imgW; w++)
                {
                        if(image->Canvas->Pixels[w][h] != crKey)
                        {
                                return TPoint(w,h);
                        }
                }
        }
        return TPoint(0,0);
}

TPoint UtilCls::LocatePoint(TPoint curr, int& orgin, TImage * image, TColor crKey)
{
        //TODO: Add your source code here
        TPoint tpArr[8];
        tpArr[0].x = curr.x - 1;
        tpArr[0].y = curr.y - 1;
        tpArr[1].x = curr.x - 1;
        tpArr[1].y = curr.y;
        tpArr[2].x = curr.x - 1;
        tpArr[2].y = curr.y + 1;
        tpArr[3].x = curr.x;
        tpArr[3].y = curr.y + 1;
        tpArr[4].x = curr.x + 1;
        tpArr[4].y = curr.y + 1;
        tpArr[5].x = curr.x + 1;
        tpArr[5].y = curr.y;
        tpArr[6].x = curr.x + 1;
        tpArr[6].y = curr.y - 1;
        tpArr[7].x = curr.x;
        tpArr[7].y = curr.y - 1;

        int imgW,imgH;
        imgW = image->Width;
        imgH = image->Height;
        if(orgin<4)
        {
                orgin=orgin+4;
        }
        else
        {
                orgin=orgin-4;
        }
        for(int loop = 0;loop < 8;loop++)
        {
                orgin++;
                if(orgin > 7)
                        orgin -= 8;
                if(tpArr[orgin].x < 0 || tpArr[orgin].x >= imgW ||tpArr[orgin].y < 0 || tpArr[orgin].y >= imgH)
                        continue;
                if(image->Canvas->Pixels[tpArr[orgin].x][tpArr[orgin].y] != crKey)
                {
                        return  tpArr[orgin];
                }
        }
        return TPoint(0,0);
}

TPoint* UtilCls::ComputeOutline(TImage * image, TColor crKey, int& count)
{
        //TODO: Add your source code here
        DynamicArray<TPoint> tp;
        TPoint orginp,nextp,currp;
        int orgin = 4;
        orginp = LocateFirstPoint(image,crKey);
        currp = orginp;
        do
        {
                nextp = LocatePoint(currp,orgin,image,crKey);
                if(nextp.x == orginp.x && nextp.y == orginp.y)
                {
                        break;
                }
                tp.Length = tp.Length + 1;
                tp[tp.Length - 1] = nextp;
                currp = nextp;
        }while(true);
        int loop = tp.Length;
        count = loop;
        TPoint * rtn = new TPoint[loop];
        for(int i=0;i < loop;i++)
        {
            rtn[i].x = tp[i].x;
            rtn[i].y = tp[i].y;
        }
        return rtn;
}

实际使用

//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
#include "_UtilCls.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
        int count;
        HRGN WndRgn,TempRgn;
        TPoint* a = UtilCls::ComputeOutline(Image1,Image1->Canvas->Pixels[0][0],count); //一个函数就可以了
        WndRgn = CreateRectRgn(0,0,Image1->Width,Image1->Height);
        TempRgn = CreatePolygonRgn(a,count,ALTERNATE);
        CombineRgn(WndRgn,WndRgn,TempRgn,RGN_AND);
        DeleteObject(TempRgn);
        delete a;
        SetWindowRgn(Handle,WndRgn,true);
}
//---------------------------------------------------------------------------

本文地址:http://com.8s8s.com/it/it22422.htm