有一张图,想在图上根据用户指定的范围(多边形,各点已知)得到范围内的图片内容,而在范围之外则填充为其它的颜色。

解决方案 »

  1.   

    这个好像有人写过这样的BLOG,百度搜搜
    可以新建一个FORM或者其他控件之类,覆盖现有FORM,透明度为80左右,鼠标拖动时区域内透明度为100.
    具体代码自己写写或者搜搜吧.
      

  2.   

    没有直接的算法来实现吗?不通过覆盖FORM实现
      

  3.   

    很简单,给你个思路吧。
    原数据是一系列的点。
    声明一个数组a(x,y),其值均为0.先将这些点按顺序连成多线段,然后将头尾相连,形成一个由线勾画成的封闭形(位图)线上的每个点值>0,如果要做成PS的蒙片效果,还需要在中间插值。
    在a上自点(0,0)开始,使用种子算法,将所有相邻的为0的点连接起来,赋予一个高位值,如1.其它部分为0,返回为数组b//应切除图像,新增底色的部分
    声明数组C = 1 - b;//应保留图像的部分
    声明数组D = 源图 * C;//被保留的图像
    声明数组E,由你指定的其它色彩赋值
    E = b * E//做成底色的图像
    声明数组 F = E + D
    即得到答,输出。
    其中的位图均是以数组的形式表达,位图与数组的具体转换方法略。
      

  4.   


    namespace WindowsApplication29
    {
        public partial class Form1 : Form
        {
            Point[] Points = new Point[] { new Point(41, 42), new Point(200, 0), new Point(300, 200), new Point(220, 180), new Point(20, 240),
                new Point(41,42) };        public Form1()
            {
                InitializeComponent();
                Bitmap bmp = new Bitmap(pictureBox1.Image); // pictureBox1 放的是原图,宽>300,高>220
                pictureBox2.Image = bmp; // 拷贝到pictureBox2先
                GraphicsUnit gu = GraphicsUnit.Pixel; 
                RectangleF r = pictureBox2.Image.GetBounds(ref gu);  
                Region or = new Region(r); // 原始的图片大小的区间
                System.Drawing.Drawing2D.GraphicsPath gp = new System.Drawing.Drawing2D.GraphicsPath();
                gp.AddPolygon(Points);
                Region nr = new Region(gp); // 多边形区间
                or.Exclude(nr); //  原始的图片大小的区间减去多边形区间后的区间
                Graphics g = Graphics.FromImage(pictureBox2.Image);
                g.FillRegion(new SolidBrush(Color.Red), or); // 这个区间涂成红色,也就是你说的图片指定多边形区间外的区间
                g.Dispose();
            }
        }
    }