private void Init() { // Set the current instance to 'self' because we do that for some reason var self = this; // Create an array of images to be used for re-scaling and re-creating maps when needed List<Image> Images = new List<Image>(); // Modify this path as necessary. // Should direct to the folder on the ArduPilot holding geocached images string folder = @"C:\Users\nwilliams\Documents\TestGeoImages2\"; // Take a snapshot of the file system. System.IO.DirectoryInfo dir = new System.IO.DirectoryInfo(folder); // This method assumes that the application has discovery permissions for all folders under the specified path. IEnumerable<System.IO.FileInfo> fileList = dir.GetFiles("*.*", System.IO.SearchOption.AllDirectories); fileList.ToList<System.IO.FileInfo>(); // Select all geocoded .jpg files in ArduPilot picture directory // All images geotagged by ArduPilot MissionPlanner should end in "_geotog". // If this is not the case, change searchTerm to the appropriate suffix string searchTerm = "_geotag"; var allFiles = from file in fileList where file.Extension == ".jpg" let fileText = file.FullName where fileText.Contains(searchTerm) select file.FullName; // Create the Graphics element that will house our mosaic map // Use high quality interpolation for scaling, allowing zoom and pan without sacrificing resolution ///PictureBox Mosaic = new PictureBox(); ImageBox imageBox = new ImageBox(); // Iterate through each file we found in ArduPilots image directory, creating an image of each file. // Returns updates destination coordinates /// TODO: /// Place them in their appropriate position on our map. /// Formulas for converting Latitude and Longitude to Meters exist; use them /// Consider using each pixel as one meter for scaling purposes; change if necessarry foreach (string file in allFiles) { Images.Add(Image.FromFile(file)); } MakeMosaic(allFiles, imageBox, 800, 600, 1f, 1f); imageBox.Dispose(); }
private void MakeMosaic(IEnumerable<String> files, ImageBox g, int containerWidth, int containerHeight, float scaleX, float scaleY) { List<PlottedImage> Plotting = new List<PlottedImage>(); bool firstImage = true; int upperBound = 0; int rightBound = 0; int leftBound = 0; int lowerBound = 0; // Initialization variables to be used and edited as the Mosaic is created // Points array containes X [0th spot] and Y [ 1st spot] coordinates. int[] Points = new int[] { containerHeight/2, containerWidth/2 }; ///TODO: /// Point X and point Y need to be derived from GPS coordinates rather than arbitrary random integers Random rand = new Random(); foreach (string file in files) { //Direction is random until gps coordinates can be attained int temp = rand.Next(1, 4); switch (temp){ case 1: if (firstImage) { Point centerPlot = new Point((containerWidth / 2) - (Image.FromFile(file).Width / 2), (containerHeight / 2) - (Image.FromFile(file).Height / 2)); Plotting.Add(new PlottedImage { Picture = Image.FromFile(file), Plot = centerPlot, defaultHeight = Image.FromFile(file).Height, defaultWidth = Image.FromFile(file).Width }); firstImage = false; upperBound = (containerHeight / 2) - (Image.FromFile(file).Height / 2); lowerBound = (containerHeight / 2) - (Image.FromFile(file).Height / 2) + Image.FromFile(file).Height; leftBound = (containerWidth / 2) - (Image.FromFile(file).Width / 2); rightBound = (containerWidth / 2) - (Image.FromFile(file).Width / 2) + Image.FromFile(file).Width; } else { Plotting.Add(new PlottedImage { Picture = Image.FromFile(file), Plot = new Point(rightBound, upperBound), defaultHeight = Image.FromFile(file).Height, defaultWidth = Image.FromFile(file).Width }); //upperBound = upperBound - Image.FromFile(file).Height; //lowerBound = lowerBound + Image.FromFile(file).Height; leftBound = leftBound + Image.FromFile(file).Width; rightBound = rightBound + Image.FromFile(file).Width; } break; case 2: if (firstImage) { Point centerPlot = new Point((containerWidth / 2) - (Image.FromFile(file).Width / 2), (containerHeight / 2) - (Image.FromFile(file).Height / 2)); Plotting.Add(new PlottedImage { Picture = Image.FromFile(file), Plot = centerPlot, defaultHeight = Image.FromFile(file).Height, defaultWidth = Image.FromFile(file).Width }); firstImage = false; upperBound = (containerHeight / 2) - (Image.FromFile(file).Height / 2); lowerBound = (containerHeight / 2) - (Image.FromFile(file).Height / 2) + Image.FromFile(file).Height; leftBound = (containerWidth / 2) - (Image.FromFile(file).Width / 2); rightBound = (containerWidth / 2) - (Image.FromFile(file).Width / 2) + Image.FromFile(file).Width; } else { Plotting.Add(new PlottedImage { Picture = Image.FromFile(file), Plot = new Point(leftBound - Image.FromFile(file).Width, upperBound), defaultHeight = Image.FromFile(file).Height, defaultWidth = Image.FromFile(file).Width }); leftBound = leftBound - Image.FromFile(file).Width; rightBound = rightBound - Image.FromFile(file).Width; } break; case 3: if (firstImage) { Point centerPlot = new Point((containerWidth / 2) - (Image.FromFile(file).Width / 2), (containerHeight / 2) - (Image.FromFile(file).Height / 2)); Plotting.Add(new PlottedImage { Picture = Image.FromFile(file), Plot = centerPlot, defaultHeight = Image.FromFile(file).Height, defaultWidth = Image.FromFile(file).Width }); firstImage = false; upperBound = (containerHeight / 2) - (Image.FromFile(file).Height / 2); lowerBound = (containerHeight / 2) - (Image.FromFile(file).Height / 2) + Image.FromFile(file).Height; leftBound = (containerWidth / 2) - (Image.FromFile(file).Width / 2); rightBound = (containerWidth / 2) - (Image.FromFile(file).Width / 2) + Image.FromFile(file).Width; } else { Plotting.Add(new PlottedImage { Picture = Image.FromFile(file), Plot = new Point(leftBound, lowerBound), defaultHeight = Image.FromFile(file).Height, defaultWidth = Image.FromFile(file).Width }); upperBound = upperBound + Image.FromFile(file).Height; lowerBound = lowerBound + Image.FromFile(file).Height; } break; case 4: if (firstImage) { Point centerPlot = new Point((containerWidth / 2) - (Image.FromFile(file).Width / 2), (containerHeight / 2) - (Image.FromFile(file).Height / 2)); Plotting.Add(new PlottedImage { Picture = Image.FromFile(file), Plot = centerPlot, defaultHeight = Image.FromFile(file).Height, defaultWidth = Image.FromFile(file).Width }); firstImage = false; upperBound = (containerHeight / 2) - (Image.FromFile(file).Height / 2); lowerBound = (containerHeight / 2) - (Image.FromFile(file).Height / 2) + Image.FromFile(file).Height; leftBound = (containerWidth / 2) - (Image.FromFile(file).Width / 2); rightBound = (containerWidth / 2) - (Image.FromFile(file).Width / 2) + Image.FromFile(file).Width; } else { Plotting.Add(new PlottedImage { Picture = Image.FromFile(file), Plot = new Point(leftBound, upperBound), defaultHeight = Image.FromFile(file).Height, defaultWidth = Image.FromFile(file).Width }); lowerBound = lowerBound - Image.FromFile(file).Height; upperBound = upperBound - Image.FromFile(file).Height; } break; } } foreach (PlottedImage piece in Plotting) { g.DrawImage(piece.Picture); } }