在一幅图象上,我用polyline圈定了一个八边形区域,非正多边形,我想剪裁这个区域,请问该怎样实现呢?还能用copyrect吗,我觉得好象不行啊,它只是复制矩形区域的,请各位帮忙。在线等待

解决方案 »

  1.   

    我帮你顶一下,我也遇到了类似的问题,现在也未解决,关注中。
    我是利用屏幕截图,但是我不想把全部截得的图像放进一副BITMAP中,
    想截取部分放入,请高手帮我解决一下,谢谢!
      

  2.   

    to : hehaidaxue(陈克)  你也想截取不规则的区域吗?要是截取规则的四边形就简单的多了,用canvas.brushcopy 和canvas.copyrect就能实现了
      

  3.   

    我这里只提供一个思路,不知是否可行:)
    首先得确定区域内的每一点是否属于所选择的区域,这有些麻烦,算法自己想想吧。然后用图片的Canvas属性的Pixels属性遍历图像每一点并将所选区域外的点都设成某一颜色比如黑色(或将此黑色设位透明色),拷贝处理过的图像即可。办法有些笨,希望各位高手能找到更好的办法。
      

  4.   

    我的想法和 sooxm(阿宣)和差不多:我首先把要选定的区域用折线圈起来(用红色线),用moveto和lineto就能实现,然后分别从左,从右扫描,找到左右边界点(遇到红色点),左边界点以前的点置成白色,右边界点以后的点置成白色,这样,就能完成不规则图片的剪裁了,不知思路是否可行,请各位指点
      

  5.   

    创建一个等大的白色(全1)的Bitmap,
    然后在它上面用PolyPolygon绘制要截取的区域并填充内部为黑色(全0),
    然后把原图BitBlt到它上面,使用OR模式。
      

  6.   

    PolyPolygon是做什么的啊,我查delphi帮助,没看见这个呀,怎么用啊,它内部的变量怎样写呢,快教教我,你的这个方法很好啊,是不是图层的概念啊?
      

  7.   

    PolyPolygon是windows Api函数,Delphi帮助当然没有了,查Windows SDK.
      

  8.   

    我想用鼠标事件实现各个点的连接,就是用鼠标点击区域,点击过程中不断的连接各个点,用canvas.lineto实现,可是现在有个问题,初始点不知该怎样确定,每次都从(0,0)点画上一条到第一个点击的线,我不想要这条线,请问该怎样做呢,我的鼠标事件的程序是:
    procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    begin
       if (x>0)and(x<image1.Width )and(y>0)and(y<image1.Height )then
         begin
           image1.Cursor:=crCross;
           edit1.Text:=inttostr(x);
           edit2.Text:=inttostr(y);
           image1.Canvas.LineTo(strtoint(edit1.Text ),strtoint(edit2.Text ));//我想一定是这里出错了,因为顺序执行时,默认了初始点(0,0),然后划了那条线
         end;end;procedure TForm1.Image1MouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    var
    i,j:integer;
     begin
         image1.Cursor:=crcross;
         i :=strtoint(edit1.Text) ;
         j :=strtoint(edit2.Text) ;
         image1.Canvas.Pen.Color:=clblue;
         image1.Canvas.Pen.Width:=1;
         image1.Canvas.MoveTo(i,j);
    end;
    procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    begin
        edit1.Text :=inttostr(x);
        edit2.Text :=inttostr(y);
    end;
      

  9.   

    谢谢mxd6819318(安琪儿),我的截图的确简单,按照您的方法我已经实现了,
    继续学习中!
      

  10.   

    楼主:我看到一份资料可能对你有所帮助现在写出来,如下:
    //-----------------------------------------------------
    //这是实现位图蒙板的代码,先在主窗体中画布全画为白,白色为0,
    //而用次窗体画的椭圆形为大小,给主窗体的画布画一个黑色的椭圆,黑色为1
    //之后调用API函数BitBlt将次窗体全部复制给主窗体,但其复制模式
    //为SRCPAINT,即源位图与主窗体画布进行and运算,结果源位图只有在主窗体画布
    //黑色区域就椭圆部分的图像得到显示,而其他部分都被与掉了,所以看到的就
    //只有椭圆部分,这就是椭圆抓屏的实现技术
          Form1.ScrImage.Canvas.Pen.Color:=clWhite;
          Form1.ScrImage.Canvas.Brush.Style:=bsSolid;
          Form1.ScrImage.Canvas.Brush.Color:=clWhite;
          Form1.ScrImage.Canvas.Rectangle(0,0,width,Height);
          Form1.ScrImage.Canvas.Pen.Color:=clBlack;
          Form1.ScrImage.Canvas.Brush.Color:=clBlack;
          Form1.ScrImage.Canvas.Ellipse(0,0,width,Height);
          image1.Canvas.Ellipse(orgPoint.X,orgPoint.Y,X,Y);
          BitBlt (Form1.ScrImage.Canvas.Handle, 0, 0,width ,Height,
          Image1.Canvas.Handle, orgPoint.X, orgPoint.Y, SRCPAINT);