public virtual Imager ComposeFrames(int imageWidth, int imageHeight, ImageStackLayout imageStackLayout) { var stageFrames = _images.Length; _outputImage = new Image <Rgba32>(imageWidth, imageHeight); var singleImageWidth = imageWidth; var singleImageHeight = imageHeight; Func <int, Point> pointBuilder; switch (imageStackLayout) { case ImageStackLayout.Horizontal: singleImageWidth = imageWidth / stageFrames; pointBuilder = index => new Point(singleImageWidth * index, 0); break; case ImageStackLayout.Vertical: singleImageHeight = imageHeight / stageFrames; pointBuilder = index => new Point(0, singleImageHeight * index); break; default: throw new ArgumentOutOfRangeException(nameof(imageStackLayout), imageStackLayout, null); } Parallel.For(0, _images.Length, index => { var image = _images[index]; image.Mutate(o => o.Resize(new Size(singleImageWidth, singleImageHeight))); _outputImage.Mutate(o => o.DrawImage(image, pointBuilder.Invoke(index), 1f)); }); return(this); }
private async void LoadAnimations() { await Task.WhenAny( ImageStackLayout.FadeTo(1, 1000), PlotLabel.TranslateTo(-10, 0, 600, Easing.BounceIn), FactsStackLayout.TranslateTo(0, 30, 600) ); await Task.WhenAll( PlotLabel.TranslateTo(0, 0, 300), FactsStackLayout.TranslateTo(0, 0, 300) ); }