Example #1
0
        private ImageMergerMode GetMergeMode()
        {
            ImageMergerMode mode = ImageMergerMode.None;

            if (rbCenter.Checked)
            {
                mode = ImageMergerMode.Center;
            }
            if (rbFill.Checked)
            {
                mode = ImageMergerMode.Fill;
            }
            if (rbOutline.Checked)
            {
                mode = ImageMergerMode.Outline;
            }
            if (rbCrop.Checked)
            {
                mode = ImageMergerMode.Crop;
            }
            return(mode);
        }
Example #2
0
        public static void AlignImages(List<string> images, string folder, ImageMergerMode mode)
        {
            Size final = new Size(1920, 1080);
            //Size final = new Size(480, 360);

            Bitmap primary = (Bitmap)Bitmap.FromFile(images[0]);

            if (Directory.Exists(folder))
            {
                Helper.DeleteDirectory(folder);
            }

            List<Point> points = new List<Point>();
            for (int i = 1; i < images.Count; i++)
            {
                points.Add(new Point(0, 0));
            }

            int next = 1;
            Parallel.For(1, images.Count, i =>
            {
                Bitmap previousImage = (Bitmap)Bitmap.FromFile(images[i - 1]);
                Bitmap nextImage = (Bitmap)Bitmap.FromFile(images[i]);

                points[i - 1] = GetRelativePosition(previousImage, nextImage);

                if (OnNextPoint != null)
                {
                    OnNextPoint(next++);
                }
            } );

            Point cropUL = new Point(0, 0);
            Point cropBR = new Point(primary.Width, primary.Height);
            List<Point> pointsAdjusted = new List<Point>();
            List<Rectangle> runningCrop = new List<Rectangle>();
            Point accumulatedOffsets = new Point(0, 0);

            for (int i = 1; i < images.Count; i++)
            {
                Point p = points[i - 1];
                accumulatedOffsets = new Point(accumulatedOffsets.X + p.X, accumulatedOffsets.Y + p.Y);
                pointsAdjusted.Add(accumulatedOffsets);

                cropUL.X = Math.Max(cropUL.X, accumulatedOffsets.X);
                cropUL.Y = Math.Max(cropUL.Y, accumulatedOffsets.Y);
                cropBR.X = Math.Min(cropBR.X, accumulatedOffsets.X + primary.Width);
                cropBR.Y = Math.Min(cropBR.Y, accumulatedOffsets.Y + primary.Height);

                runningCrop.Add(new Rectangle(-pointsAdjusted[i - 1].X + cropUL.X, -pointsAdjusted[i - 1].Y + cropUL.Y, cropBR.X - cropUL.X, cropBR.Y - cropUL.Y));

                if (OnNextRelative != null)
                {
                    OnNextRelative(i);
                }
            }

            if (!Directory.Exists(folder))
            {
                Directory.CreateDirectory(folder);
            }

            next = 1;
            Parallel.For(1, images.Count, i =>
            {
                Bitmap originalFrame = (Bitmap)Bitmap.FromFile(images[i]);

                Rectangle subImageRec = new Rectangle(-pointsAdjusted[i - 1].X + cropUL.X, -pointsAdjusted[i - 1].Y + cropUL.Y, cropBR.X - cropUL.X, cropBR.Y - cropUL.Y);

                Bitmap finalFrame;
                switch (mode)
                {
                    case ImageMergerMode.Crop:
                        finalFrame = CropFrame(originalFrame, subImageRec);
                        break;
                    case ImageMergerMode.Center:
                        finalFrame = CenterFrame(originalFrame, pointsAdjusted[i - 1]);
                        break;
                    case ImageMergerMode.Outline:
                        finalFrame = OutlineFrame(originalFrame, subImageRec, runningCrop[i - 1]);
                        break;
                    case ImageMergerMode.Fill:
                        finalFrame = FillFrame(originalFrame, subImageRec);
                        break;
                    default:
                        throw new ArgumentException("ImageMergerMode not specified!");
                }

                finalFrame.Save(folder + "\\frame" + i.ToString().PadLeft(6, '0') + ".bmp", ImageFormat.Bmp);

                if (OnNextStitch != null)
                {
                    OnNextStitch(next++);
                }
            });
        }
Example #3
0
        public static void AlignImages(List <string> images, string folder, ImageMergerMode mode)
        {
            Size final = new Size(1920, 1080);
            //Size final = new Size(480, 360);

            Bitmap primary = (Bitmap)Bitmap.FromFile(images[0]);

            if (Directory.Exists(folder))
            {
                Helper.DeleteDirectory(folder);
            }

            List <Point> points = new List <Point>();

            for (int i = 1; i < images.Count; i++)
            {
                points.Add(new Point(0, 0));
            }

            int next = 1;

            Parallel.For(1, images.Count, i =>
            {
                Bitmap previousImage = (Bitmap)Bitmap.FromFile(images[i - 1]);
                Bitmap nextImage     = (Bitmap)Bitmap.FromFile(images[i]);

                points[i - 1] = GetRelativePosition(previousImage, nextImage);

                if (OnNextPoint != null)
                {
                    OnNextPoint(next++);
                }
            });

            Point            cropUL             = new Point(0, 0);
            Point            cropBR             = new Point(primary.Width, primary.Height);
            List <Point>     pointsAdjusted     = new List <Point>();
            List <Rectangle> runningCrop        = new List <Rectangle>();
            Point            accumulatedOffsets = new Point(0, 0);

            for (int i = 1; i < images.Count; i++)
            {
                Point p = points[i - 1];
                accumulatedOffsets = new Point(accumulatedOffsets.X + p.X, accumulatedOffsets.Y + p.Y);
                pointsAdjusted.Add(accumulatedOffsets);

                cropUL.X = Math.Max(cropUL.X, accumulatedOffsets.X);
                cropUL.Y = Math.Max(cropUL.Y, accumulatedOffsets.Y);
                cropBR.X = Math.Min(cropBR.X, accumulatedOffsets.X + primary.Width);
                cropBR.Y = Math.Min(cropBR.Y, accumulatedOffsets.Y + primary.Height);

                runningCrop.Add(new Rectangle(-pointsAdjusted[i - 1].X + cropUL.X, -pointsAdjusted[i - 1].Y + cropUL.Y, cropBR.X - cropUL.X, cropBR.Y - cropUL.Y));

                if (OnNextRelative != null)
                {
                    OnNextRelative(i);
                }
            }

            if (!Directory.Exists(folder))
            {
                Directory.CreateDirectory(folder);
            }

            next = 1;
            Parallel.For(1, images.Count, i =>
            {
                Bitmap originalFrame = (Bitmap)Bitmap.FromFile(images[i]);

                Rectangle subImageRec = new Rectangle(-pointsAdjusted[i - 1].X + cropUL.X, -pointsAdjusted[i - 1].Y + cropUL.Y, cropBR.X - cropUL.X, cropBR.Y - cropUL.Y);

                Bitmap finalFrame;
                switch (mode)
                {
                case ImageMergerMode.Crop:
                    finalFrame = CropFrame(originalFrame, subImageRec);
                    break;

                case ImageMergerMode.Center:
                    finalFrame = CenterFrame(originalFrame, pointsAdjusted[i - 1]);
                    break;

                case ImageMergerMode.Outline:
                    finalFrame = OutlineFrame(originalFrame, subImageRec, runningCrop[i - 1]);
                    break;

                case ImageMergerMode.Fill:
                    finalFrame = FillFrame(originalFrame, subImageRec);
                    break;

                default:
                    throw new ArgumentException("ImageMergerMode not specified!");
                }

                finalFrame.Save(folder + "\\frame" + i.ToString().PadLeft(6, '0') + ".bmp", ImageFormat.Bmp);

                if (OnNextStitch != null)
                {
                    OnNextStitch(next++);
                }
            });
        }