private static CubeManifest ParseCubeManifest(string cubeManifestPath) { var manifest = new CubeManifest(); manifest.CubeManifestPath = cubeManifestPath; var cubeManifestLines = File.ReadAllLines(cubeManifestPath); // Expected format: // comment Sample File // Unknown 19 // Largest Size 1040 // Angular Bounds -180,180,-58.8321,40.5767 // Image coords per face 0,front,0,0,0,934,1040,934,1040,0 // 1,right,0,0,0,934,1040,934,1040,0 // 2,back,0,0,0,1040,1040,1040,1040,0 // 3,left,0,0,0,1040,1040,1040,1040,0 // 4,top,0,0,0,1040,1040,1040,1040,0 // 5,bottom,0,832,0,1040,199,1040,199,832 // Note that not all faces of the cube are always included. if (cubeManifestLines.Length < 4) { throw new ArgumentException( string.Format( "Expected CubeManifest file of at least 4 lines (one cube face), got {0} lines for file '{1}'", cubeManifestLines.Length, cubeManifestPath)); } var line0 = cubeManifestLines[0]; var maxSizeLine = cubeManifestLines[1]; if (!int.TryParse(maxSizeLine, out manifest.LargestFaceSize)) { throw new ArgumentException( string.Format( "Unable to parse line as integer line in file '{0}'({1}), got '{2}'", cubeManifestPath, 2, maxSizeLine)); } var panoramaAngularBounds = cubeManifestPath[2]; // We don't need the information stored for each face, don't bother parsing it. //for (int lineIndex = 3; lineIndex < cubeManifestLines.Length; ++lineIndex) //{ // var faceLine = cubeManifestLines[lineIndex]; // var faceLineParts = faceLine.Split(','); // if (faceLineParts.Length != 10) // { // throw new ArgumentException( // string.Format( // "Invalid face line in file '{0}'({1}), expected 10 parts when split by comma, got {2}. Line Looks like '{3}'", // cubeManifestPath, lineIndex + 1, faceLineParts.Length, faceLine)); // } //} return(manifest); }
private static void CompositeCubemapIntoSingleImage(CubeManifest cubeManifest, int faceSize, string synthOutputCubemapPath) { string deepzoomroot = Path.GetDirectoryName(cubeManifest.CubeManifestPath); // Combine images into single .png using (var bmp = new Bitmap(faceSize * 4, faceSize * 4)) { using (var graphics = Graphics.FromImage(bmp)) { ProcessFace(graphics, Path.Combine(deepzoomroot, "left_files"), new Rectangle(0, faceSize, faceSize, faceSize), cubeManifest.LargestFaceSize); ProcessFace(graphics, Path.Combine(deepzoomroot, "front_files"), new Rectangle(faceSize, faceSize, faceSize, faceSize), cubeManifest.LargestFaceSize); ProcessFace(graphics, Path.Combine(deepzoomroot, "right_files"), new Rectangle(2 * faceSize, faceSize, faceSize, faceSize), cubeManifest.LargestFaceSize); ProcessFace(graphics, Path.Combine(deepzoomroot, "back_files"), new Rectangle(3 * faceSize, faceSize, faceSize, faceSize), cubeManifest.LargestFaceSize); ProcessFace(graphics, Path.Combine(deepzoomroot, "top_files"), new Rectangle(faceSize, 0, faceSize, faceSize), cubeManifest.LargestFaceSize); ProcessFace(graphics, Path.Combine(deepzoomroot, "bottom_files"), new Rectangle(faceSize, 2 * faceSize, faceSize, faceSize), cubeManifest.LargestFaceSize); } bmp.Save(synthOutputCubemapPath, ImageFormat.Png); } }
private static CubeManifest ParseCubeManifest(string cubeManifestPath) { var manifest = new CubeManifest(); manifest.CubeManifestPath = cubeManifestPath; var cubeManifestLines = File.ReadAllLines(cubeManifestPath); // Expected format: // comment Sample File // Unknown 19 // Largest Size 1040 // Angular Bounds -180,180,-58.8321,40.5767 // Image coords per face 0,front,0,0,0,934,1040,934,1040,0 // 1,right,0,0,0,934,1040,934,1040,0 // 2,back,0,0,0,1040,1040,1040,1040,0 // 3,left,0,0,0,1040,1040,1040,1040,0 // 4,top,0,0,0,1040,1040,1040,1040,0 // 5,bottom,0,832,0,1040,199,1040,199,832 // Note that not all faces of the cube are always included. if (cubeManifestLines.Length < 4) { throw new ArgumentException( string.Format( "Expected CubeManifest file of at least 4 lines (one cube face), got {0} lines for file '{1}'", cubeManifestLines.Length, cubeManifestPath)); } var line0 = cubeManifestLines[0]; var maxSizeLine = cubeManifestLines[1]; if (!int.TryParse(maxSizeLine, out manifest.LargestFaceSize)) { throw new ArgumentException( string.Format( "Unable to parse line as integer line in file '{0}'({1}), got '{2}'", cubeManifestPath, 2, maxSizeLine)); } var panoramaAngularBounds = cubeManifestPath[2]; // We don't need the information stored for each face, don't bother parsing it. //for (int lineIndex = 3; lineIndex < cubeManifestLines.Length; ++lineIndex) //{ // var faceLine = cubeManifestLines[lineIndex]; // var faceLineParts = faceLine.Split(','); // if (faceLineParts.Length != 10) // { // throw new ArgumentException( // string.Format( // "Invalid face line in file '{0}'({1}), expected 10 parts when split by comma, got {2}. Line Looks like '{3}'", // cubeManifestPath, lineIndex + 1, faceLineParts.Length, faceLine)); // } //} return manifest; }