Exemple #1
0
        private void button1_Click(object sender, EventArgs e)
        {
            Bitmap     bm    = (Bitmap)pictureBox1.Image;
            BitmapData pdata = bm.LockBits(new Rectangle(0, 0, bm.Width, bm.Height),
                                           ImageLockMode.ReadWrite, bm.PixelFormat);

            try
            {
                IBitmapMagicWand  wand = new BitmapMagicWand();
                ScanLinePolygon[] polygons;
                //wand.Extract(pdata, new Point(497, 200),
                //    new byte[] { 227, 9, 0 },
                //    64,
                //    true,
                //    out bs);
                //wand.Extract(pdata, new Point(0, 0),
                //    new byte[] { 255, 212, 23 },
                //    64,
                //    false,
                //    out bs);
                //wand.Extract(pdata, new Point(6584, 5516),
                //    new byte[] { 23, 20, 15 },
                //    16,
                //    true,
                //    out bs);
                wand.FillColor(pdata, new Point(76, 98), 32, true, new byte[] { 0, 0, 255 });
            }
            finally
            {
                bm.UnlockBits(pdata);
            }
            pictureBox1.Refresh();
        }
Exemple #2
0
        //魔术棒判识
        private void HandleMagicWand(object result, Dictionary <string, object> args)
        {
            GeometryOfDrawed geometry = result as GeometryOfDrawed;
            IRasterDrawing   drawing  = GetRasterDrawing(_canvasViewer);

            if (drawing == null)
            {
                return;
            }
            double prjX = 0, prjY = 0;
            ICoordinateTransform tran = _canvasViewer.Canvas.CoordTransform;

            //如果鼠标没有点中图像有效区域则直接退出
            tran.Raster2Prj(geometry.RasterPoints[0].X, geometry.RasterPoints[0].Y, out prjX, out prjY);
            if (prjX < drawing.OriginalEnvelope.MinX ||
                prjX > drawing.OriginalEnvelope.MaxX ||
                prjY < drawing.OriginalEnvelope.MinY ||
                prjY > drawing.OriginalEnvelope.MaxY)
            {
                return;
            }
            //计算鼠标在当前视窗位图中的位置
            int x = (int)((prjX - drawing.Envelope.MinX) / (drawing.Envelope.Width / (float)drawing.Bitmap.Width));
            int y = (int)((drawing.Envelope.MaxY - prjY) / (drawing.Envelope.Height / (float)drawing.Bitmap.Height));

            using (IBitmapMagicWand magicWand = new BitmapMagicWand())
            {
                Bitmap     crtBitmap = drawing.Bitmap;
                BitmapData pdata     = crtBitmap.LockBits(new Rectangle(0, 0, crtBitmap.Width, crtBitmap.Height), ImageLockMode.ReadWrite, crtBitmap.PixelFormat);
                try
                {
                    byte tolerance   = 32;
                    bool isContinued = true;
                    if (args != null && args.Count == 2)
                    {
                        tolerance   = byte.Parse(args["tolerance"].ToString());
                        isContinued = bool.Parse(args["iscontinued"].ToString());
                    }

                    /*
                     * 魔术棒提取
                     * ScanLineSegment为像素坐标扫描线三元组(Row,BeginCol,EndCol)
                     */
                    ScanLineSegment[] segs = magicWand.ExtractSnappedPixels(pdata, new Point(x, y), tolerance, isContinued);

                    /*
                     * 将扫描线数组转换为判识结果
                     */
                    MagicWandResult2ExtractReulst(segs, drawing);
                }
                finally
                {
                    crtBitmap.UnlockBits(pdata);
                }
                _canvasViewer.Canvas.Refresh(enumRefreshType.All);
            }
        }
Exemple #3
0
 private void pictureBox1_MouseUp(object sender, MouseEventArgs e)
 {
     if (e.Button == System.Windows.Forms.MouseButtons.Right)
     {
         Bitmap     bm    = (Bitmap)pictureBox1.Image;
         BitmapData pdata = bm.LockBits(new Rectangle(0, 0, bm.Width, bm.Height), ImageLockMode.ReadWrite, bm.PixelFormat);
         try
         {
             using (IBitmapMagicWand wand = new BitmapMagicWand())
             {
                 Text = e.Location.ToString();
                 wand.FillColor(pdata, new Point(e.X, e.Y), 16, checkBox1.Checked, new byte[] { 0, 0, 255 });
                 //ScanLineSegment[] segs = wand.ExtractSnappedPixels(pdata, new Point(e.X, e.Y), 16, checkBox1.Checked);
             }
         }
         finally
         {
             bm.UnlockBits(pdata);
         }
         pictureBox1.Refresh();
     }
 }