public static async Task GenerateMosaicFromTilesAsync(
            Stream sourceImage,
            CloudBlobContainer tileContainer, string tileDirectory,
            Stream outputStream,
            int tilePixels,
            TraceWriter log)
        {
            using (var tileProvider = new QuadrantMatchingTileProvider()) {
                MosaicBuilder.TileHeight = int.Parse(Environment.GetEnvironmentVariable("MosaicTileWidth"));
                MosaicBuilder.TileWidth  = int.Parse(Environment.GetEnvironmentVariable("MosaicTileHeight"));

                // override default tile width and height if specified
                if (tilePixels != 0)
                {
                    MosaicBuilder.TileWidth = MosaicBuilder.TileHeight = tilePixels;
                }

                MosaicBuilder.DitheringRadius = -1;
                MosaicBuilder.ScaleMultiplier = 1;
                List <byte[]> tileImages = await GetTileImagesAsync(tileContainer, tileDirectory, log);

                tileProvider.SetSourceStream(sourceImage);
                tileProvider.ProcessInputImageColors(MosaicBuilder.TileWidth, MosaicBuilder.TileHeight);
                tileProvider.ProcessTileColors(tileImages);

                log.Info("Generating mosaic...");
                var start = DateTime.Now;

                GenerateMosaic(tileProvider, sourceImage, tileImages, outputStream);

                log.Info($"Time to generate mosaic: {(DateTime.Now - start).TotalMilliseconds}");
            }
        }
Ejemplo n.º 2
0
        public static void GenerateMosaicFromTiles(
            Stream sourceImage, CloudBlobContainer tileContainer, string tileDirectory, Stream outputStream)
        {
            using (var tileProvider = new QuadrantMatchingTileProvider()) {
                MosaicBuilder.TileHeight      = int.Parse(Environment.GetEnvironmentVariable("MosaicTileWidth"));
                MosaicBuilder.TileWidth       = int.Parse(Environment.GetEnvironmentVariable("MosaicTileHeight"));
                MosaicBuilder.DitheringRadius = -1;
                MosaicBuilder.ScaleMultiplier = 1;

                var directory  = tileContainer.GetDirectoryReference(tileDirectory);
                var blobs      = directory.ListBlobs(true);
                var tileImages = new List <byte[]>();

                foreach (var b in blobs)
                {
                    if (b.GetType() == typeof(CloudBlockBlob))
                    {
                        var blob = (CloudBlockBlob)b;
                        blob.FetchAttributes();

                        var bytes = new byte[blob.Properties.Length];
                        blob.DownloadToByteArray(bytes, 0);

                        tileImages.Add(bytes);
                    }
                }

                tileProvider.SetSourceStream(sourceImage);
                tileProvider.ProcessInputImageColors(MosaicBuilder.TileWidth, MosaicBuilder.TileHeight);
                tileProvider.ProcessTileColors(tileImages);

                GenerateMosaic(tileProvider, sourceImage, tileImages, outputStream);
            }
        }