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); }
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++); } }); }
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++); } }); }