用图形剪切了做软件界面是个常用的手段,算法也有很多,这个算做原创,非常简单,图形不是很复杂的情况下效率比较高(也是一般的情况)
.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);
}
//---------------------------------------------------------------------------