Exemple #1
0
        public async Task <byte[]> CreateImg()
        {
            //переменные для расчета центар входящего изображения
            int ind_left  = 100000;
            int ind_right = -1;
            int ind_top   = -1;
            int ind_bot   = -1;

            //создание зеленого изображения участка
            ImageOut = ImageIn.Convert <Bgr, byte>().ThresholdBinary(new Bgr(0, 0, 0), new Bgr(120, 255, 0));
            //создание выходных изображений(чб и цветное)
            BigImg = new Image <Gray, byte>((ImageIn.Width + (int)((border / scale) * 4)), (ImageIn.Height + (int)((border / scale) * 4)));
            Image <Bgr, byte> BigImg_Color = new Image <Bgr, byte>((ImageIn.Width + (int)((border / scale) * 4)), (ImageIn.Height + (int)((border / scale) * 4)));

            //расчет центральной точки
            #region Верхний индекс
            for (int i = 0; i < ImageOut.Height; i++)
            {
                for (int j = 0; j < ImageOut.Width; j++)
                {
                    if (ImageOut.Data[i, j, 1] != 0)
                    {
                        ind_top = i;
                        break;
                    }
                }
                if (ind_top == i)
                {
                    break;
                }
            }
            #endregion
            #region Нижний индекс
            for (int i = 0; i < ImageOut.Height; i++)
            {
                for (int j = 0; j < ImageOut.Width; j++)
                {
                    if (ImageOut.Data[i, j, 1] != 0)
                    {
                        if (ind_bot <= i)
                        {
                            ind_bot = i;
                        }
                    }
                }
            }
            #endregion
            #region Левый индекс
            for (int i = 0; i < ImageOut.Height; i++)
            {
                for (int j = 0; j < ImageOut.Width; j++)
                {
                    if (ImageOut.Data[i, j, 1] != 0)
                    {
                        if (ind_left > j)
                        {
                            ind_left = j;
                        }
                    }
                }
            }
            #endregion
            #region Правый индекс
            for (int i = 0; i < ImageOut.Height; i++)
            {
                for (int j = 0; j < ImageOut.Width; j++)
                {
                    if (ImageOut.Data[i, j, 1] != 0)
                    {
                        if (ind_right < j)
                        {
                            ind_right = j;
                        }
                    }
                }
            }
            #endregion

            System.Drawing.Point center = new System.Drawing.Point(ind_left + (ind_right - ind_left) / 2, ind_top + (ind_bot - ind_top) / 2);
            //совмещение входящего изображения и выходного ЧБ
            BigImg = SummImg(BigImg, ImageIn);
            //отрисовка границ СЗЗ
            BigImg = DrawBorder(BigImg);
            //рисунок границ СЗЗ совмещается с выходныс изображением (цветное)
            BigImg_Color     = SummImg(BigImg_Color, BigImg);
            _ImageWithBorder = BigImg_Color;

            //Image<> to Bitmapsource
            ImageOutBitMap = ToBitmapSource(BigImg_Color);

            //Bitmapsource to Bitmap
            Bitmap result_img = GetBitmap(ImageOutBitMap);
            //Прозрачность
            var color = System.Drawing.Color.Black;
            result_img.MakeTransparent(color);
            // result_img.Save("result.png");
            //WorkWithCad();
            ImageConverter converter = new ImageConverter();
            byte[]         res_img   = (byte[])converter.ConvertTo(result_img, typeof(byte[]));
            return(res_img);
        }
Exemple #2
0
        private Image <Gray, byte> MoveBorderToPlace()
        {
            Image <Gray, byte> ImageInGray = ImageIn.Convert <Gray, byte>();
            Image <Gray, byte> ImageBorder = _ImageWithBorder.Convert <Gray, byte>();
            int ind_left  = 100000;
            int ind_right = -1;
            int ind_top   = -1;
            int ind_bot   = -1;

            #region Верхний индекс
            for (int i = 0; i < ImageInGray.Height; i++)
            {
                for (int j = 0; j < ImageInGray.Width; j++)
                {
                    if (ImageInGray.Data[i, j, 0] != 0)
                    {
                        ind_top = i;
                        break;
                    }
                }
                if (ind_top == i)
                {
                    break;
                }
            }
            #endregion
            #region Нижний индекс
            for (int i = 0; i < ImageInGray.Height; i++)
            {
                for (int j = 0; j < ImageInGray.Width; j++)
                {
                    if (ImageInGray.Data[i, j, 0] != 0)
                    {
                        if (ind_bot <= i)
                        {
                            ind_bot = i;
                        }
                    }
                }
            }
            #endregion
            #region Левый индекс
            for (int i = 0; i < ImageInGray.Height; i++)
            {
                for (int j = 0; j < ImageInGray.Width; j++)
                {
                    if (ImageInGray.Data[i, j, 0] != 0)
                    {
                        if (ind_left > j)
                        {
                            ind_left = j;
                        }
                    }
                }
            }
            #endregion
            #region Правый индекс
            for (int i = 0; i < ImageInGray.Height; i++)
            {
                for (int j = 0; j < ImageInGray.Width; j++)
                {
                    if (ImageInGray.Data[i, j, 0] != 0)
                    {
                        if (ind_right < j)
                        {
                            ind_right = j;
                        }
                    }
                }
            }
            #endregion

            System.Drawing.Point centerImageIn     = new System.Drawing.Point(ind_left + (ind_right - ind_left) / 2, ind_top + (ind_bot - ind_top) / 2);
            System.Drawing.Point centerImageBorder = new System.Drawing.Point(_ImageWithBorder.Width / 2, _ImageWithBorder.Height / 2);
            System.Drawing.Point vector            = new System.Drawing.Point(Math.Max(centerImageIn.X, centerImageBorder.X) - Math.Min(centerImageIn.X, centerImageBorder.X), Math.Max(centerImageIn.Y, centerImageBorder.Y) - Math.Min(centerImageIn.Y, centerImageBorder.Y));
            //все точки на границе СЗЗ

            List <DatePoint> pointsPlace = new List <DatePoint>();
            //Границы
            for (int i = 0; i < ImageBorder.Height; i++)
            {
                for (int j = 0; j < ImageBorder.Width; j++)
                {
                    if (ImageBorder.Data[i, j, 0] != 0 && (ImageBorder.Data[i + 1, j, 0] == 0 || ImageBorder.Data[i - 1, j, 0] == 0 || ImageBorder.Data[i, j + 1, 0] == 0 || ImageBorder.Data[i, j - 1, 0] == 0))
                    {
                        ListBorderPonts.Add(new DatePoint(j, i, 0));
                    }
                }
            }
            //Белый участок
            for (int i = 0; i < ImageInGray.Height; i++)
            {
                for (int j = 0; j < ImageInGray.Width; j++)
                {
                    if (ImageInGray.Data[i, j, 0] != 0)
                    {
                        pointsPlace.Add(new DatePoint(j, i, 0));
                    }
                }
            }
            //перенос в записимости от взаиморасположения центров
            List <DatePoint> _list_border_points = new List <DatePoint>();
            foreach (var item in ListBorderPonts)
            {
                _list_border_points.Add(item);
            }
            ListBorderPonts.Clear();
            foreach (var item in _list_border_points)
            {
                try
                {
                    if (centerImageBorder.X >= centerImageIn.X && centerImageBorder.Y >= centerImageIn.Y)
                    {
                        ImageInGray.Data[item._y - vector.Y, item._x - vector.X, 0] = 255;
                        ListBorderPonts.Add(new DatePoint(item._x - vector.X, item._y - vector.Y, 0));
                    }
                    else if (centerImageBorder.X >= centerImageIn.X && centerImageBorder.Y <= centerImageIn.Y)
                    {
                        ImageInGray.Data[item._y + vector.Y, item._x - vector.X, 0] = 255;
                        ListBorderPonts.Add(new DatePoint(item._x - vector.X, item._y + vector.Y, 0));
                    }
                    else if (centerImageBorder.X <= centerImageIn.X && centerImageBorder.Y >= centerImageIn.Y)
                    {
                        ImageInGray.Data[item._y - vector.Y, item._x + vector.X, 0] = 255;
                        ListBorderPonts.Add(new DatePoint(item._x + vector.X, item._y - vector.Y, 0));
                    }
                    else if (centerImageBorder.X <= centerImageIn.X && centerImageBorder.Y <= centerImageIn.Y)
                    {
                        ImageInGray.Data[item._y + vector.Y, item._x + vector.X, 0] = 255;
                        ListBorderPonts.Add(new DatePoint(item._x + vector.X, item._y + vector.Y, 0));
                    }
                }
                catch (Exception)
                {
                    continue;
                    throw;
                }
            }
            foreach (var item in pointsPlace)
            {
                ImageInGray.Data[item._y, item._x, 0] = 255;
            }
            return(ImageInGray);
        }