还是关于图片剪裁的问题 在一幅图象上,我用polyline圈定了一个八边形区域,非正多边形,我想剪裁这个区域,请问该怎样实现呢?还能用copyrect吗,我觉得好象不行啊,它只是复制矩形区域的,请各位帮忙。在线等待 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 我帮你顶一下,我也遇到了类似的问题,现在也未解决,关注中。我是利用屏幕截图,但是我不想把全部截得的图像放进一副BITMAP中,想截取部分放入,请高手帮我解决一下,谢谢! to : hehaidaxue(陈克) 你也想截取不规则的区域吗?要是截取规则的四边形就简单的多了,用canvas.brushcopy 和canvas.copyrect就能实现了 我这里只提供一个思路,不知是否可行:)首先得确定区域内的每一点是否属于所选择的区域,这有些麻烦,算法自己想想吧。然后用图片的Canvas属性的Pixels属性遍历图像每一点并将所选区域外的点都设成某一颜色比如黑色(或将此黑色设位透明色),拷贝处理过的图像即可。办法有些笨,希望各位高手能找到更好的办法。 我的想法和 sooxm(阿宣)和差不多:我首先把要选定的区域用折线圈起来(用红色线),用moveto和lineto就能实现,然后分别从左,从右扫描,找到左右边界点(遇到红色点),左边界点以前的点置成白色,右边界点以后的点置成白色,这样,就能完成不规则图片的剪裁了,不知思路是否可行,请各位指点 创建一个等大的白色(全1)的Bitmap,然后在它上面用PolyPolygon绘制要截取的区域并填充内部为黑色(全0),然后把原图BitBlt到它上面,使用OR模式。 PolyPolygon是做什么的啊,我查delphi帮助,没看见这个呀,怎么用啊,它内部的变量怎样写呢,快教教我,你的这个方法很好啊,是不是图层的概念啊? PolyPolygon是windows Api函数,Delphi帮助当然没有了,查Windows SDK. 我想用鼠标事件实现各个点的连接,就是用鼠标点击区域,点击过程中不断的连接各个点,用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);vari,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; 谢谢mxd6819318(安琪儿),我的截图的确简单,按照您的方法我已经实现了,继续学习中! 楼主:我看到一份资料可能对你有所帮助现在写出来,如下://-----------------------------------------------------//这是实现位图蒙板的代码,先在主窗体中画布全画为白,白色为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); 这个SQL语句该怎么写 ComboBox中加载图标 用table可以显示表内容,query为什么不行?! 问大家一个问题 何获取文字笔画数? 无分讨论 Aspack的压缩原理是怎样的?我就搞不明白,它怎么能有那么大的本事(诚邀老灌水的那个伴水进来) 文件分发程序 请教高手,怎样将mainmenu主菜单项与coolbar中的toolbar中的button相结合 关于adotable 与dbgrid的问题 我需要帮忙!!! 软考通过。散分!! dxdbgrid的高手进来。
我是利用屏幕截图,但是我不想把全部截得的图像放进一副BITMAP中,
想截取部分放入,请高手帮我解决一下,谢谢!
首先得确定区域内的每一点是否属于所选择的区域,这有些麻烦,算法自己想想吧。然后用图片的Canvas属性的Pixels属性遍历图像每一点并将所选区域外的点都设成某一颜色比如黑色(或将此黑色设位透明色),拷贝处理过的图像即可。办法有些笨,希望各位高手能找到更好的办法。
然后在它上面用PolyPolygon绘制要截取的区域并填充内部为黑色(全0),
然后把原图BitBlt到它上面,使用OR模式。
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;
继续学习中!
//-----------------------------------------------------
//这是实现位图蒙板的代码,先在主窗体中画布全画为白,白色为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);