コード例 #1
0
        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);
        }
コード例 #2
0
        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);
            }
        }
コード例 #3
0
        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;
        }
コード例 #4
0
        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);
            }
        }