Example #1
0
        public static void BicubicWindowOscillatesCorrectly(float x, float expected)
        {
            var   sampler = new BicubicResampler();
            float result  = sampler.GetValue(x);

            Assert.Equal(result, expected);
        }
Example #2
0
        static void Main(string[] args)
        {
            var commandline =
                args.Select((x, i) => new { index = i, option = x })
                .Where(x => x.option.StartsWith("-")).Select(x => new
            {
                option    = x.option.Substring(1),
                arguments = args.Skip(x.index + 1)
                            .TakeWhile(m => !m.StartsWith("-")).ToArray()
            })
                .ToDictionary(x => x.option.ToLower(), x => x.arguments);

            if (args.Length == 0 || commandline.ContainsKey("h") || commandline.ContainsKey("help"))
            {
                Console.WriteLine("Tiler XYZ tile maker v1.0");
                Console.WriteLine("Usage:");
                Console.WriteLine("Tiler.exe image.jpg");
                Console.WriteLine(" or");
                Console.WriteLine("Tiler.exe -input image.jpg -output output_folder -size 256 -zoom 6");
                return;
            }

            var sourceFile = commandline.Count == 0 && args.Length > 0 ? args[0] : commandline["input"].First();
            int tile_size  = commandline.ContainsKey("size") ? int.Parse(commandline["size"].First()) : 256;
            var Directory  = commandline.ContainsKey("output") ? commandline["output"].First() : new System.IO.FileInfo(sourceFile).Directory.FullName + System.IO.Path.DirectorySeparatorChar + string.Format("{0}-tiles", commandline.ContainsKey("stdin") ? "STDIN" : new System.IO.FileInfo(sourceFile).Name);

            System.IO.DirectoryInfo OutputDirectory = System.IO.Directory.CreateDirectory(Directory);
            var OriginalSource = commandline.ContainsKey("stdin") ? Image <Rgba32> .Load(Console.OpenStandardInput()) : Image <Rgba32> .Load(sourceFile);

            int maxzoom = commandline.ContainsKey("zoom") ? int.Parse(commandline["zoom"].First()) :
                          ((int)Math.Ceiling(Math.Log(Math.Max(OriginalSource.Width, OriginalSource.Height) / (double)tile_size)) + 1); // auto detect max level

            var Sampler = new BicubicResampler();

            for (int zoom = 0; zoom <= maxzoom; zoom++)
            {
                int tiles = (int)Math.Pow(2.0, zoom);
                int size  = tiles * tile_size;
                using (var Scaled = new Image <Rgba32>(size, size))
                {
                    Scaled.Mutate(i => i.Clear(Color.Transparent));
                    {
                        if (OriginalSource.Width > OriginalSource.Height)
                        {
                            int width  = Scaled.Width;
                            int height = width * OriginalSource.Height / OriginalSource.Width;
                            Scaled.Mutate(x => x.DrawImage(OriginalSource.Clone(x => x.Resize(width, height, Sampler)), new Point(0, (Scaled.Height - height) / 2), new GraphicsOptions()));
                        }
                        else
                        {
                            int height = Scaled.Height;
                            int width  = height * OriginalSource.Width / OriginalSource.Height;
                            Scaled.Mutate(x => x.DrawImage(OriginalSource.Clone(x => x.Resize(width, height, Sampler)), new Point((Scaled.Width - width) / 2, 0), new GraphicsOptions()));
                        }
                    }
                    Enumerable.Range(0, tiles).SelectMany(x => Enumerable.Range(0, tiles).Select(y => new { x, y })).AsParallel().ForAll((c) =>
                    {
                        using var Tile = new Image <Rgba32>(tile_size, tile_size);
                        lock (Scaled)
                            Tile.Mutate(x => x.DrawImage(Scaled.Clone(x => x.Crop(new Rectangle(c.x * tile_size, c.y * tile_size, tile_size, tile_size))), new Point(0, 0), new GraphicsOptions()));
                        var l = OutputDirectory.FullName + System.IO.Path.DirectorySeparatorChar + zoom.ToString() + "_" + c.x.ToString() + "_" + c.y.ToString() + ".png";
                        Tile.Save(l);
                    });
                }
            }
        }