这个函数不行,是在canvas里任意画的图形,没法创建他的handle,所以次函数不能判断

解决方案 »

  1.   


    这里还有点资料!http://www.csdn.net/oldexpert/TopicView.asp?id=30544&table=2000
      

  2.   

    procedure TForm1.Button2Click(Sender: TObject);
    var
      Region: HRGN;
    begin
      BeginPath(Canvas.Handle);
      Canvas.Polygon([Point(1, 1), Point(100, 1), Point(100, 100), Point(1, 100)]);
      EndPath(Canvas.Handle);
      Region := PathToRegion(Canvas.Handle);
      if PtInRegion(Region, 10, 10) then ShowMessage('10, 10');
      if PtInRegion(Region, 101, 10) then ShowMessage('101, 10');
    end;
      

  3.   

    //方法比较变态,并不推荐
    function PointInPolygon(mPoint: TPoint; mPoints: array of TPoint): Boolean;
    var
      Region: HRGN;
    begin
      with TForm.Create(nil) do try
        BeginPath(Canvas.Handle);
        Canvas.Polygon(mPoints);
        EndPath(Canvas.Handle);
        Region := PathToRegion(Canvas.Handle);
        Result := PtInRegion(Region, mPoint.X, mPoint.Y);
        DeleteObject(Region);
      finally
        Free;
      end;
    end; { PointInPolygon }procedure TForm1.Button2Click(Sender: TObject);
    begin
      if PointInPolygon(Point(10, 10),
        [Point(1, 1), Point(100, 1), Point(100, 100), Point(1, 100)]) then
        ShowMessage('10, 10');
      if PointInPolygon(Point(101, 10),
        [Point(1, 1), Point(100, 1), Point(100, 100), Point(1, 100)]) then
        ShowMessage('101, 10');
    end;
      

  4.   

    TCanvas.Polygon
    procedure Polygon(const Points: array ofTPoint; Winding: Boolean = False; StartIndex: Integer = 0; NumPts: Integer = -1);
    另外zswang(伴水)(被黑中)的方法绝对可行,也不是太慢(直大致思路,代码没细看):
      

  5.   

    哪个方法我试过,很慢,我想用这个函数fillrgn(),但不能填充,不知道为什么?
    procedure Tform1.fillPolygon(mPoints:array of TPoint);
    var
      Region:HRGN;
    begin
      with TForm.Create(nil) do try
        BeginPath(Canvas.Handle);
        Canvas.Polygon(mPoints);
        EndPath(Canvas.Handle);
        Region:=PathToRegion(canvas.Handle );
        //paintrgn(canvas.Handle,Region);
        Fillrgn(canvas.Handle,Region,canvas.Brush.Handle);
        finally
        free;
       end;
    end;
    请指点
      

  6.   

    一个小例子,希望对你有帮助!
    procedure TForm1.Button1Click(Sender: TObject);
    var
      rgn : HRGN;
      rgnPoints : array of TPoint;
      hbr : HBRUSH;
      point : TPoint;
    begin
      setlength(rgnPoints,4);
      rgnPoints[0].X := 0;
      rgnPoints[0].Y := 0;
      rgnPoints[1].X := 100;
      rgnPoints[1].Y := 0;
      rgnPoints[2].X := 100;
      rgnPoints[2].Y := 100;
      rgnPoints[3].X := 0;
      rgnPoints[3].Y := 100;
      point.X := 50;
      point.Y := 50;
      rgn := CreatePolygonRgn(rgnPoints[0],4,WINDING);
      if rgn<>0 then
      begin
            hbr := CreateSolidBrush(clRed);
            if (Ptinregion(rgn,point.X,point.Y)=True) then
              FillRgn(Form1.Canvas.Handle,rgn,hbr);
            deleteObject(rgn);
            DeleteObject(hbr);
      end;
    end;
      

  7.   

    哇,你后面的要求太高了点,属于纹理分析的范畴;
    如果背景是单一的,你可以用FloodFill试试!
      

  8.   

    我知道怎么做,就是用pixels[x,y]可以实现,但得一个一个像素的判断,扫描,所以ptinregion函数就不适合了,填充的方法也不太好
      

  9.   

    等等,我现在有点明白你的意思了,
    你是不是想改变整个图的色度呀,这就简单多了!
    我还以为,墙变了,而花纹的颜色呀都不改变!
    你可以用Tbitmap的Scanline性质来做,当然只能是24bit图,而且原理就是逐点扫描,但是快得多,不过里面还要用到颜色模型的转换!
      

  10.   

    是啊,但scanline函数更不好,他不能用颜色模型来转换,也不能用算法 来判断一个点,不方便,还有其他的方法吗?
      

  11.   

    呵呵,我说得不是太清楚,scanline只是取道每个象素点的r,g,b值罢了,具体的还需要你自己去做,比如说把rgb颜色模型转换为其他的hsi等颜色模型,然后固定s,i,改变h,在转变回来,写入
    bmp中,以前我就是这样做的;不过不知道你到底要做什么,所以恐怕也不是很适合!
      

  12.   

    你可以用先前的方法判断是不是在区域内!
    1。至于取点的颜色,可以用pixels[i,j],你已试过,太慢,
    2。也可以另外创建的bmp,用pixels[i,j],会比直接用canvas的快一些!处理完后,在整个将bmp画到画布上去!
    3。用指针,直接从bmp的scanline属性中取该点颜色,当然了此法最麻烦,但速度也相对较快!
    该法的其余部分同2。
      

  13.   

    在内存创建的不能得到pixels的值,次法不妥。
      

  14.   

    可以的,还是用
     bmp := Tbitmap.create(),然后copyrect()
    然后 bmp.canvas.pixels[i,j];这样做就不是每画一个点就更新一遍用户界面,所以会比第一法快一些!
      

  15.   

    我试过,这样得不到pixels[i,j]的值
      

  16.   

    不可能的,只要是Tbitmap都可以这样的
    bmp.canvas.pixels[i,j]
      

  17.   

    你的方法不能得到图片的每个像素的color值
      

  18.   

    当然可以了,pixels[i,j]可以直接得到color值;
    32bit,从高到低依次为: 
      Alpha通道,Blue通道,Green通道,Red通道,
    每个通道一个字节,正好!
    对于一般的处理而言,可以不管Alpha通道!
    用scanline得到24bit图,没有Alpha通道!