/// <summary> /// Processes the input equirectangular image. /// </summary> /// <param name="inputImage"> /// Input image path. /// </param> /// <param name="outputDir"> /// Output directory where pyramid is generated. /// </param> /// <param name="projection"> /// Projection type. /// </param> private static void ProcessEquirectangularImage(string inputImage, string outputDir, ProjectionTypes projection) { Trace.TraceInformation("{0}: Reading image..", DateTime.Now.TimeOfDay.ToString(@"hh\:mm\:ss", CultureInfo.InvariantCulture)); ImageFormat imageFormat = ImageFormat.Png; // Set the grid boundaries var imageBoundary = new Boundary(-180, -90, 180, 90); // Build an image grid using the input image var imageGrid = new ImageGrid(inputImage, true); // Build the grid map for equirectangular projection using the image grid and boundary co-ordinates var equirectangularGridMap = new EquirectangularGridMap(imageGrid, imageBoundary); // Build the color map using equirectangular projection grid map var imageColorMap = new ImageColorMap(equirectangularGridMap); var maximumLevelsOfDetail = TileHelper.CalculateMaximumLevel(imageGrid.Height, imageGrid.Width, imageBoundary); // Define ITileCreator instance for creating image tiles. ITileCreator tileCreator = TileCreatorFactory.CreateImageTileCreator(imageColorMap, projection, outputDir); // Define plumbing for looping through all the tiles to be created for base image and pyramid. var tileGenerator = new TileGenerator(tileCreator); // Start building base image and the pyramid. Trace.TraceInformation("{0}: Building base and parent levels...", DateTime.Now.TimeOfDay.ToString(@"hh\:mm\:ss", CultureInfo.InvariantCulture)); tileGenerator.Generate(maximumLevelsOfDetail); string fileName = Path.GetFileNameWithoutExtension(inputImage); // Generate Plate file. Trace.TraceInformation("{0}: Building Plate file...", DateTime.Now.TimeOfDay.ToString(@"hh\:mm\:ss", CultureInfo.InvariantCulture)); ImageTileSerializer pyramid = new ImageTileSerializer(TileHelper.GetDefaultImageTilePathTemplate(outputDir), ImageFormat.Png); PlateFileGenerator plateGenerator = new PlateFileGenerator( Path.Combine(outputDir, fileName + ".plate"), maximumLevelsOfDetail, ImageFormat.Png); plateGenerator.CreateFromImageTile(pyramid); // Generate Thumbnail Images. Trace.TraceInformation("{0}: Building Thumbnail image..", DateTime.Now.TimeOfDay.ToString(@"hh\:mm\:ss", CultureInfo.InvariantCulture)); string thumbnailFile = Path.Combine(outputDir, fileName + ".jpeg"); TileHelper.GenerateThumbnail(inputImage, 96, 45, thumbnailFile, ImageFormat.Jpeg); // Get the path of image tiles created and save it in WTML file. Trace.TraceInformation("{0}: Building WTML file..", DateTime.Now.TimeOfDay.ToString(@"hh\:mm\:ss", CultureInfo.InvariantCulture)); string pyramidPath = WtmlCollection.GetWtmlTextureTilePath(TileHelper.GetDefaultImageTilePathTemplate(outputDir), imageFormat.ToString()); // Create and save WTML collection file. WtmlCollection wtmlCollection = new WtmlCollection(fileName, thumbnailFile, pyramidPath, maximumLevelsOfDetail, projection); string path = Path.Combine(outputDir, fileName + ".wtml"); wtmlCollection.Save(path); Trace.TraceInformation("{0}: Collection successfully generated.", DateTime.Now.TimeOfDay.ToString(@"hh\:mm\:ss", CultureInfo.InvariantCulture)); }
/// <summary> /// Processes a list of input image tiles and generates pyramid for level N. /// </summary> /// <param name="inputFilePath">Xml file with list of image tile information.</param> /// <param name="outputDir">Output directory where the image tiles of pyramid has to be stored.</param> /// <param name="projection">Projection to be used.</param> /// <param name="inputBoundary">Input image boundary.</param> private static void ProcessMultipartEquirectangularImage(string inputFilePath, string outputDir, ProjectionTypes projection, Boundary inputBoundary) { ImageFormat imageFormat = ImageFormat.Png; Trace.TraceInformation("{0}: Reading image..", DateTime.Now.TimeOfDay.ToString(@"hh\:mm\:ss", CultureInfo.InvariantCulture)); // Get the list of equirectangular images input. string[,] imageTiles = Program.GetInputImageList(inputFilePath); // Check if the image is circular. double longitudeDelta = inputBoundary.Right - inputBoundary.Left; bool circular = (360.0 - longitudeDelta) < 0.000001; // Build an image grid using the input images var imageGrid = new ImageGrid(imageTiles, circular); // Build the grid map for equirectangular projection using the image grid and boundary co-ordinates var equirectangularGridMap = new EquirectangularGridMap(imageGrid, inputBoundary); // Build the color map using equirectangular projection grid map var imageColorMap = new ImageColorMap(equirectangularGridMap); var maximumLevelsOfDetail = TileHelper.CalculateMaximumLevel(imageGrid.Height, imageGrid.Width, inputBoundary); // Define ITileCreator instance for creating image tiles. ITileCreator tileCreator = TileCreatorFactory.CreateImageTileCreator(imageColorMap, projection, outputDir); // Define bounds of the image. Image is assumed to cover the entire world. // If not, change the coordinates accordingly. // For Mercator projection, longitude spans from -180 to +180 and latitude from 90 to -90. Boundary gridBoundary = new Boundary(inputBoundary.Left, inputBoundary.Top, inputBoundary.Right, inputBoundary.Bottom); if (projection == ProjectionTypes.Toast) { // For Toast projection, longitude spans from 0 to +360 and latitude from 90 to -90. gridBoundary.Left += 180; gridBoundary.Right += 180; } // Define plumbing for looping through all the tiles to be created for base image and pyramid. var tileGenerator = new TileGenerator(tileCreator); // Start building base image and the pyramid. Trace.TraceInformation("{0}: Building base and parent levels...", DateTime.Now.TimeOfDay.ToString(@"hh\:mm\:ss", CultureInfo.InvariantCulture)); tileGenerator.Generate(maximumLevelsOfDetail, gridBoundary); string fileName = Path.GetFileNameWithoutExtension(inputFilePath); // Generate Plate file. Trace.TraceInformation("{0}: Building Plate file...", DateTime.Now.TimeOfDay.ToString(@"hh\:mm\:ss", CultureInfo.InvariantCulture)); ImageTileSerializer pyramid = new ImageTileSerializer(TileHelper.GetDefaultImageTilePathTemplate(outputDir), ImageFormat.Png); PlateFileGenerator plateGenerator = new PlateFileGenerator( Path.Combine(outputDir, fileName + ".plate"), maximumLevelsOfDetail, ImageFormat.Png); plateGenerator.CreateFromImageTile(pyramid); // Generate Thumbnail Images. Trace.TraceInformation("{0}: Building Thumbnail image..", DateTime.Now.TimeOfDay.ToString(@"hh\:mm\:ss", CultureInfo.InvariantCulture)); string thumbnailFile = Path.Combine(outputDir, fileName + ".jpeg"); TileHelper.GenerateThumbnail(pyramid.GetFileName(0, 0, 0), 96, 45, thumbnailFile, ImageFormat.Jpeg); // Get the path of image tiles created and save it in WTML file. Trace.TraceInformation("{0}: Building WTML file..", DateTime.Now.TimeOfDay.ToString(@"hh\:mm\:ss", CultureInfo.InvariantCulture)); string pyramidPath = WtmlCollection.GetWtmlTextureTilePath(TileHelper.GetDefaultImageTilePathTemplate(outputDir), imageFormat.ToString()); // Create and save WTML collection file. WtmlCollection wtmlCollection = new WtmlCollection(fileName, thumbnailFile, pyramidPath, maximumLevelsOfDetail, projection, inputBoundary); string path = Path.Combine(outputDir, fileName + ".wtml"); wtmlCollection.Save(path); Trace.TraceInformation("{0}: Collection successfully generated.", DateTime.Now.TimeOfDay.ToString(@"hh\:mm\:ss", CultureInfo.InvariantCulture)); }