internal byte[] SaveChartAsBytes(UserControl barchart)
        {
            double width  = barchart.Width;
            double height = barchart.Height;

            byte[]  rval    = null;
            Viewbox viewbox = new Viewbox();

            viewbox.Child = barchart;
            viewbox.Measure(Size.Empty);
            viewbox.Measure(new System.Windows.Size(width, height));
            viewbox.Arrange(new Rect(0, 0, width, height));
            viewbox.UpdateLayout();
            using (MemoryStream ms = new MemoryStream())
            {
                RenderTargetBitmap render = new RenderTargetBitmap((int)width, (int)height, 1 / 300, 1 / 300, PixelFormats.Pbgra32);
                render.Render(viewbox);
                PngBitmapEncoder png = new PngBitmapEncoder();
                png.Frames.Add(BitmapFrame.Create(render));
                png.Save(ms);
                ms.Seek(0, SeekOrigin.Begin);
                rval = ms.ToArray();
                ms.Close();
                viewbox.Child = null;
            }

            return(rval);
        }
示例#2
0
        private static void RenderAppIconBitmap()
        {
            var grid = (Grid)Application.Current.FindResource("PhxLogoGrid");

            if (grid == null)
            {
                throw new ArgumentException("Failed to find logo Grid", "PhxLogoGrid");
            }

            var viewbox = new Viewbox();

            viewbox.Child = grid;
            viewbox.Measure(new Size(512, 512));
            viewbox.Arrange(new Rect(0, 0, 512, 512));
            viewbox.UpdateLayout();

            var    viewbox_ps = PresentationSource.FromVisual(viewbox);
            double dpiX = 96.0, dpiY = 96.0;

            if (viewbox_ps != null)
            {
                dpiX *= viewbox_ps.CompositionTarget.TransformToDevice.M11;
                dpiY *= viewbox_ps.CompositionTarget.TransformToDevice.M22;
            }

            gAppIconBitmap = new RenderTargetBitmap((int)viewbox.ActualWidth, (int)viewbox.ActualHeight, dpiX, dpiY, PixelFormats.Pbgra32);
            gAppIconBitmap.Render(viewbox);
        }
示例#3
0
        public static BitmapSource Render(Geometry geometry, Brush brush, Gdip.Size originalSize, Gdip.Size size)
        {
            Path path = new Path
            {
                Data   = geometry,
                Fill   = brush,
                Width  = originalSize.Width,
                Height = originalSize.Height,
            };
            Viewbox vbox = new Viewbox
            {
                Width  = size.Width,
                Height = size.Height,
                Child  = path,
            };

            vbox.Measure(new Size(size.Width, size.Height));
            vbox.Arrange(new Rect(0.0, 0.0, size.Width, size.Height));

            RenderTargetBitmap bitmap = new RenderTargetBitmap(size.Width, size.Height, 96, 96, PixelFormats.Pbgra32);

            bitmap.Render(vbox);

            return(bitmap);
        }
示例#4
0
        private static Brush SelectedBrush(string value, bool selected = false)
        {
            TextBlock textBlock;

            if (selected)
            {
                textBlock = new TextBlock()
                {
                    Text = value, Background = new SolidColorBrush(Colors.GreenYellow)
                }
            }
            ;
            else
            {
                textBlock = new TextBlock()
                {
                    Text = value, Background = Brushes.Transparent
                }
            };
            Size    size    = new Size(40, 40);
            Viewbox viewBox = new Viewbox();

            viewBox.Child = textBlock;
            viewBox.Measure(size);
            viewBox.Arrange(new Rect(size));
            RenderTargetBitmap bitmap = new RenderTargetBitmap(35, 40, 80, 80, PixelFormats.Pbgra32);

            bitmap.Render(viewBox);

            return(new ImageBrush(bitmap));
        }
        private void BuildPngOnClick(object sender, RoutedEventArgs e)
        {
            var myChart = new LiveCharts.Uwp.CartesianChart
            {
                DisableAnimations = true,
                Width             = 600,
                Height            = 200,
                Series            = new SeriesCollection
                {
                    new LineSeries
                    {
                        Values = new ChartValues <double> {
                            1, 6, 7, 2, 9, 3, 6, 5
                        }
                    }
                }
            };

            var viewbox = new Viewbox();

            viewbox.Child = myChart;
            viewbox.Measure(myChart.RenderSize);
            viewbox.Arrange(new Rect(new Point(0, 0), myChart.RenderSize));
            myChart.Update(true, true); //force chart redraw
            viewbox.UpdateLayout();

            //SaveToPng(myChart, "chart.png");
            //png file was created at the root directory.
        }
示例#6
0
        /// <summary>
        /// 基本的な設定を利用して <see cref="FrameworkElement"/> の <see cref="FixedDocument"/> を作成します。
        /// </summary>
        /// <param name="v">ドキュメントに変換する要素のコレクション。</param>
        /// <param name="stretch">ドキュメントの伸縮。</param>
        public void UpdateTemplateDocuments(IEnumerable <FrameworkElement> v, Stretch stretch)
        {
            var fixedDocument = new FixedDocument();

            foreach (var sv in v)
            {
                var page = CreatePage();
                var size = page.PrintableSize;

                // 印刷データ
                var viewbox = new Viewbox
                {
                    Width   = size.Width,
                    Height  = size.Height,
                    Stretch = stretch,
                };

                viewbox.Child = sv;

                viewbox.Arrange(new Rect(new Point(0, 0), size));
                viewbox.Measure(size);
                viewbox.UpdateLayout();

                page.FinalizePage(viewbox);

                fixedDocument.Pages.Add(page.PageContent);
            }

            Document = fixedDocument;
        }
示例#7
0
        public void SelfUpdateDocument(SampleOption option)
        {
            var page = CreatePage();
            var size = page.PrintableSize;

            var viewbox = new Viewbox
            {
                Width   = size.Width,
                Height  = size.Height,
                Stretch = System.Windows.Media.Stretch.Uniform, // 縦横比を維持してサイズの最終調整
            };
            var v  = new SamplePage();
            var vm = option;

            viewbox.Child = v;
            v.DataContext = vm;

            viewbox.Arrange(new Rect(new Point(0, 0), size));
            viewbox.Measure(size);
            viewbox.UpdateLayout();

            page.FinalizePage(viewbox);

            // ドキュメントの作成
            var fixedDocument = new FixedDocument();

            fixedDocument.Pages.Add(page.PageContent);

            Document = fixedDocument;
        }
示例#8
0
        public static Viewbox makeImgFromControl(UIElement control, string count, int typ)
        {
            Viewbox viewbox;
            int     xAxis = 0;
            Ellipse e     = new Ellipse();

            if (count.Length == 1)
            {
                xAxis = 147;
            }
            else if (count.Length == 2)
            {
                xAxis = 143;
            }
            else if (count.Length == 3)
            {
                xAxis = 141;
            }
            else if (count.Length == 4)
            {
                xAxis = 138;
            }
            viewbox = new Viewbox();
            Grid grd    = new Grid();
            var  parent = VisualTreeHelper.GetParent(control) as StackPanel;

            if (parent != null)
            {
                parent.Children.Remove(control);
            }

            grd.Children.Add(control);
            grd.Children.Add(CreateAnEllipse());
            TextBlock txt = new TextBlock {
                Margin = new Thickness(xAxis, 168, 0, 0)
            };

            // if(typ==0)
            // {
            //     App.RunsetBFTextbox = txt;
            // }
            //else if(typ==1)
            // {
            //     App.RunsetActivityTextbox = txt;
            // }
            // else
            // {
            //     App.RunsetActionTextbox = txt;
            // }
            txt.Text = count.ToString();
            grd.Children.Add(txt);
            viewbox.Child = grd;
            viewbox.Measure(new System.Windows.Size(400, 200));
            viewbox.Arrange(new Rect(0, 0, 400, 200));
            viewbox.UpdateLayout();
            return(viewbox);
        }
示例#9
0
        public static void UpdateSize(FrameworkElement element, double availableWidth)
        {
            var vbox = new Viewbox {
                Child = element
            };

            vbox.Measure(new Size(availableWidth, 2000));
            vbox.Arrange(new Rect(0, 0, availableWidth, 2000));
            vbox.UpdateLayout();
        }
示例#10
0
        public void TakeTheChart()
        {
            var viewbox = new Viewbox();

            viewbox.Child = chart;
            viewbox.Measure(chart.RenderSize);
            viewbox.Arrange(new Rect(new Point(0, 0), chart.RenderSize));
            chart.Update(true, true);
            viewbox.UpdateLayout();
            SaveToPng(chart, chart.Tag.ToString());
        }
        private double GethDocumentHeight(Viewbox viewbox, CommentRichTextBox RichTextBox)
        {
            viewbox.Child = RichTextBox;
            viewbox.Measure(new Size(double.PositiveInfinity, double.PositiveInfinity));
            viewbox.Arrange(new Rect(viewbox.DesiredSize));
            var size = new Size()
            {
                Height = viewbox.ActualHeight, Width = viewbox.ActualWidth
            };

            return(size.Height);
        }
示例#12
0
        internal void Zoom(double percent)
        {
            if (printManagerBase.PrintPageOrientation == PrintOrientation.Portrait)
            {
                PartViewbox.Height = percent * zoomHeightDelta;
                PartViewbox.Width  = percent * zoomWidthDelta;
                //WPF-33625 Measure is called to recalculate the the page size based upon the Zoom value.
#if WPF
                PartViewbox.Measure(new Size((percent * zoomHeightDelta), (percent * zoomWidthDelta)));
#endif
            }
            else
            {
                PartViewbox.Height = percent * zoomWidthDelta;
                PartViewbox.Width  = percent * zoomHeightDelta;
                //WPF-33625 Measure is called to recalculate the the page size based upon the Zoom value.
#if WPF
                PartViewbox.Measure(new Size((percent * zoomWidthDelta), (percent * zoomHeightDelta)));
#endif
            }
        }
示例#13
0
        public void Viewbox_Should_Return_Correct_SizeAndScale_StretchDirection_DownOnly(
            double childWidth, double childHeight,
            double viewboxWidth, double viewboxHeight,
            double expectedWidth, double expectedHeight,
            double expectedScale)
        {
            var target = new Viewbox
            {
                Child = new Control {
                    Width = childWidth, Height = childHeight
                },
                StretchDirection = StretchDirection.DownOnly
            };

            target.Measure(new Size(viewboxWidth, viewboxHeight));
            target.Arrange(new Rect(default, target.DesiredSize));
示例#14
0
        protected override Size MeasureOverride(Size availableSize)
        {
            Size mAvailableSize = availableSize;

            Button btn = (Button)this.FindName("btn");

            btn.Measure(availableSize);

            mAvailableSize.Height -= btn.DesiredSize.Height;

            Viewbox vbox = (Viewbox)this.FindName("vbx");

            vbox.Measure(new Size(availableSize.Width, availableSize.Height - btn.DesiredSize.Height));

            return(availableSize);
        }
示例#15
0
        public static void Print(FrameworkElement Element)
        {
            var dlg = new PrintDialog();

            dlg.PrintTicket.PageOrientation = System.Printing.PageOrientation.Portrait;

            /*var result = dlg.ShowDialog();
             * if (result == null || !(bool)result)
             *  return;*/
            var page = new Viewbox {
                Child = Element
            };


            page.Measure(new Size(dlg.PrintableAreaWidth, dlg.PrintableAreaHeight));
            page.Arrange(new Rect(new Point(0, 0), page.DesiredSize));

            dlg.PrintVisual(page, "Печать визиток");
        }
示例#16
0
        private static void RenderToLMap(Image li, string file)
        {
            Viewbox viewbox = new Viewbox {
                Child = li
            };

            viewbox.Measure(new Size(li.Width, li.Height));
            viewbox.Arrange(new Rect(0, 0, li.Width, li.Height));
            viewbox.UpdateLayout();
            RenderTargetBitmap rtb = new RenderTargetBitmap((int)li.Width, (int)li.Height, 96, 96, PixelFormats.Pbgra32);

            rtb.Render(viewbox);
            PngBitmapEncoder enc = new PngBitmapEncoder();

            enc.Frames.Add(BitmapFrame.Create(rtb));
            using (FileStream stm = File.Create(file)) {
                enc.Save(stm);
            }
        }
示例#17
0
        public System.Drawing.Bitmap ApplyShader(System.Drawing.Bitmap Source)
        {
            System.Drawing.Bitmap returnBitmap = null;

            try
            {
                returnBitmap = Source;

                img.BeginInit();
                img.Width  = Source.Width;
                img.Height = Source.Height;

                img.Source = BitmapToBitmapSource.ToBitmapSource(Source);;
                img.EndInit();

                viewbox.Measure(new Size(img.Width * scale, img.Height * scale));
                viewbox.Arrange(new Rect(0, 0, img.Width * scale, img.Height * scale));
                viewbox.UpdateLayout();

                MemoryStream outStream = new MemoryStream();

                RenderOptions.SetBitmapScalingMode(img, BitmapScalingMode.HighQuality);
                RenderTargetBitmap rtBitmap = new RenderTargetBitmap(Convert.ToInt32(img.Width * scale), Convert.ToInt32(img.Height * scale), Convert.ToInt32(WPF_DPI_X), Convert.ToInt32(WPF_DPI_Y), PixelFormats.Pbgra32);
                rtBitmap.Render(viewbox);


                BitmapFrame frame = BitmapFrame.Create(rtBitmap);
                encoder = new JpegBitmapEncoder();
                encoder.Frames.Add(frame);
                encoder.Save(outStream);
                returnBitmap = new System.Drawing.Bitmap(outStream);

                encoder  = null;
                rtBitmap = null;
                frame    = null;
            }
            catch (Exception ex)
            {
                returnBitmap = null;
            }

            return(returnBitmap);
        }
        public void Viewbox_Stretch_Uniform_Child_With_Unrestricted_Width()
        {
            var target = new Viewbox()
            {
                Child = new Rectangle()
                {
                    Width = 100, Height = 50
                }
            };

            target.Measure(new Size(double.PositiveInfinity, 200));
            target.Arrange(new Rect(new Point(0, 0), target.DesiredSize));

            Assert.Equal(new Size(400, 200), target.DesiredSize);
            var scaleTransform = target.Child.RenderTransform as ScaleTransform;

            Assert.NotNull(scaleTransform);
            Assert.Equal(4.0, scaleTransform.ScaleX);
            Assert.Equal(4.0, scaleTransform.ScaleY);
        }
        public void Viewbox_Stretch_Uniform_Child()
        {
            var target = new Viewbox()
            {
                Child = new Rectangle()
                {
                    Width = 100, Height = 50
                }
            };

            target.Measure(new Size(200, 200));
            target.Arrange(new Rect(new Point(0, 0), target.DesiredSize));

            Assert.Equal(new Size(200, 100), target.DesiredSize);
            var scaleTransform = target.Child.RenderTransform as ScaleTransform;

            Assert.NotNull(scaleTransform);
            Assert.Equal(2.0, scaleTransform.ScaleX);
            Assert.Equal(2.0, scaleTransform.ScaleY);
        }
示例#20
0
        public static ImageSource Render(int width, int height, VectorGraphicsInfo vectorGraphicsInfo)
        {
            DpiScale    dpiInfo     = VisualTreeHelper.GetDpi(App.Current.MainWindow);
            PixelFormat pixelFormat = PixelFormats.Pbgra32;

            var x = new RenderTargetBitmap(width, height, dpiInfo.PixelsPerInchX / dpiInfo.DpiScaleX, dpiInfo.PixelsPerInchY / dpiInfo.DpiScaleY, pixelFormat);

            var canvas = new Canvas
            {
                Width  = vectorGraphicsInfo.Viewbox.Width,
                Height = vectorGraphicsInfo.Viewbox.Height,
                SnapsToDevicePixels = false,
                UseLayoutRounding   = true
            };

            foreach (Path path in vectorGraphicsInfo.Paths)
            {
                canvas.Children.Add(path);
            }

            var viewbox = new Viewbox
            {
                Stretch             = Stretch.Fill,
                Width               = width,
                Height              = height,
                SnapsToDevicePixels = false,
                UseLayoutRounding   = true,
                Child               = canvas
            };

            var size = new Size(width, height);

            viewbox.Measure(size);
            viewbox.Arrange(new Rect(size));

            x.Render(viewbox);

            x.Freeze();

            return(x);
        }
示例#21
0
        /// <summary>
        ///     Render the frameworkElement to a BitmapSource
        /// </summary>
        /// <param name="frameworkElement">FrameworkElement</param>
        /// <param name="size">Size, using the bound as size by default</param>
        /// <param name="dpiX">Horizontal DPI settings</param>
        /// <param name="dpiY">Vertical DPI settings</param>
        /// <returns>BitmapSource</returns>
        public static BitmapSource ToBitmapSource(this FrameworkElement frameworkElement, Size?size = null, double dpiX = 96.0, double dpiY = 96.0)
        {
            if (frameworkElement == null)
            {
                throw new ArgumentNullException(nameof(frameworkElement));
            }
            // Make sure we have a size
            if (!size.HasValue)
            {
                var bounds = VisualTreeHelper.GetDescendantBounds(frameworkElement);
                size = bounds != Rect.Empty ? bounds.Size : new Size(16, 16);
            }

            // Create a viewbox to render the frameworkElement in the correct size
            var viewbox = new Viewbox
            {
                //frameworkElement to render
                Child = frameworkElement
            };

            viewbox.Measure(size.Value);
            viewbox.Arrange(new Rect(new Point(), size.Value));
            viewbox.UpdateLayout();

            var renderTargetBitmap = new RenderTargetBitmap((int)(size.Value.Width * dpiX / 96.0),
                                                            (int)(size.Value.Height * dpiY / 96.0),
                                                            dpiX,
                                                            dpiY,
                                                            PixelFormats.Pbgra32);
            var drawingVisual = new DrawingVisual();

            using (var drawingContext = drawingVisual.RenderOpen())
            {
                var visualBrush = new VisualBrush(viewbox);
                drawingContext.DrawRectangle(visualBrush, null, new Rect(new Point(), size.Value));
            }
            renderTargetBitmap.Render(drawingVisual);
            // Disassociate the frameworkElement from the viewbox
            viewbox.RemoveChild(frameworkElement);
            return(renderTargetBitmap);
        }
示例#22
0
        public static string GenerateChart(List <string> GivenAwnsers, string chartType)
        {
            var awn = GivenAwnsers.Distinct().OrderBy(a => a).ToArray();
            ChartValues <int> values = new ChartValues <int>();

            foreach (var l in awn)
            {
                values.Add(GivenAwnsers.Where(x => x.Equals(l)).Count());
            }

            Chart myChart;

            if (chartType == "Bar")
            {
                myChart = GenerateBar(awn, values);
            }
            else if (chartType == "Row")
            {
                myChart = GenerateRow(awn, values);
            }
            else
            {
                myChart = GeneratePie(awn, values);
            }


            var viewbox = new Viewbox();

            viewbox.Child = myChart;
            viewbox.Measure(myChart.RenderSize);
            viewbox.Arrange(new Rect(new Point(0, 0), myChart.RenderSize));
            myChart.Update(true, true); //force chart redraw
            viewbox.UpdateLayout();

            var name = DateTime.Now.ToString("dd-mm-yyyy-hh-mm-ss-fff") + ".png";

            SaveToPng(myChart, name);


            return(Location + name);
        }
示例#23
0
        public void Viewbox_Stretch_UniformToFill_Child()
        {
            using var app = UnitTestApplication.Start(TestServices.MockPlatformRenderInterface);

            var target = new Viewbox()
            {
                Stretch = Stretch.UniformToFill, Child = new Rectangle()
                {
                    Width = 100, Height = 50
                }
            };

            target.Measure(new Size(200, 200));
            target.Arrange(new Rect(new Point(0, 0), target.DesiredSize));

            Assert.Equal(new Size(200, 200), target.DesiredSize);

            Assert.True(TryGetScale(target, out Vector scale));
            Assert.Equal(4.0, scale.X);
            Assert.Equal(4.0, scale.Y);
        }
示例#24
0
        public void Viewbox_Stretch_Uniform_Child_With_Unrestricted_Height()
        {
            using var app = UnitTestApplication.Start(TestServices.MockPlatformRenderInterface);

            var target = new Viewbox()
            {
                Child = new Rectangle()
                {
                    Width = 100, Height = 50
                }
            };

            target.Measure(new Size(200, double.PositiveInfinity));
            target.Arrange(new Rect(new Point(0, 0), target.DesiredSize));

            Assert.Equal(new Size(200, 100), target.DesiredSize);

            Assert.True(TryGetScale(target, out Vector scale));
            Assert.Equal(2.0, scale.X);
            Assert.Equal(2.0, scale.Y);
        }
示例#25
0
        public void Viewbox_Stretch_Uniform_Child_With_Unrestricted_Width()
        {
            using var app = UnitTestApplication.Start(TestServices.MockPlatformRenderInterface);

            var target = new Viewbox()
            {
                Child = new Rectangle()
                {
                    Width = 100, Height = 50
                }
            };

            target.Measure(new Size(double.PositiveInfinity, 200));
            target.Arrange(new Rect(new Point(0, 0), target.DesiredSize));

            Assert.Equal(new Size(400, 200), target.DesiredSize);
            var scaleTransform = target.InternalTransform as ScaleTransform;

            Assert.NotNull(scaleTransform);
            Assert.Equal(4.0, scaleTransform.ScaleX);
            Assert.Equal(4.0, scaleTransform.ScaleY);
        }
示例#26
0
        private static Brush PrepareBrush(string value)
        {
            TextBlock textBlock = new TextBlock()
            {
                Text = value, Background = value == "1" ? Brushes.LawnGreen: Brushes.Yellow
            };
            Size    size    = new Size(40, 40);
            Viewbox viewBox = new Viewbox();

            viewBox.Child = textBlock;
            viewBox.Measure(size);
            viewBox.Arrange(new Rect(size));
            RenderTargetBitmap bitmap = new RenderTargetBitmap(35, 40, 80, 80, PixelFormats.Pbgra32);

            GC.Collect();
            GC.WaitForPendingFinalizers();
            GC.Collect();

            bitmap.Render(viewBox);

            return(new ImageBrush(bitmap));
        }
示例#27
0
        private void btnReport_Click(object sender, RoutedEventArgs e)
        {
            if (grdToPrint.Visibility == Visibility.Collapsed)
            {
                MyMessageBox.Show("يجب عرض التقرير اولاً");
                return;
            }

            //var uc = LoadTemplate(Path.Combine(Environment.CurrentDirectory, "VoucherReportTemplate.xaml")) as UserControl;

            // Create the print dialog object and set options
            PrintDialog pDialog = new PrintDialog();

            pDialog.PageRangeSelection            = PageRangeSelection.AllPages;
            pDialog.UserPageRangeEnabled          = true;
            pDialog.PrintQueue                    = System.Printing.LocalPrintServer.GetDefaultPrintQueue();
            pDialog.PrintTicket                   = pDialog.PrintQueue.DefaultPrintTicket;
            pDialog.PrintTicket.PageScalingFactor = 1;

            System.Printing.PrintCapabilities capabilities = null;
            try
            { capabilities = pDialog.PrintQueue.GetPrintCapabilities(pDialog.PrintTicket); }
            catch
            { capabilities = null; }
            sv.Content = null;
            Viewbox vb = new Viewbox();

            vb.Child = grdToPrint;

            System.Windows.Size sz = new Size(760, grdToPrint.ActualHeight);
            vb.MinWidth  = 1;
            vb.MinHeight = 1;
            vb.Measure(sz);
            vb.Arrange(new System.Windows.Rect(new System.Windows.Point(capabilities.PageImageableArea.OriginWidth, capabilities.PageImageableArea.OriginHeight), sz));

            pDialog.PrintVisual(vb, "MyViewBox");
            vb.Child   = null;
            sv.Content = grdToPrint;
        }
示例#28
0
        public void Viewbox_Stretch_UniformToFill_Child()
        {
            using var app = UnitTestApplication.Start(TestServices.MockPlatformRenderInterface);

            var target = new Viewbox()
            {
                Stretch = Stretch.UniformToFill, Child = new Rectangle()
                {
                    Width = 100, Height = 50
                }
            };

            target.Measure(new Size(200, 200));
            target.Arrange(new Rect(new Point(0, 0), target.DesiredSize));

            Assert.Equal(new Size(200, 200), target.DesiredSize);
            var scaleTransform = target.Child.RenderTransform as ScaleTransform;

            Assert.NotNull(scaleTransform);
            Assert.Equal(4.0, scaleTransform.ScaleX);
            Assert.Equal(4.0, scaleTransform.ScaleY);
        }
示例#29
0
        private void MergeTiles(FileInfo targetFile, XkcdTile topLeftTile, XkcdTile topRightTile, XkcdTile bottomLeftTile, XkcdTile bottomRightTile)
        {
            if (topLeftTile != null ||
                topRightTile != null ||
                bottomLeftTile != null ||
                bottomRightTile != null)
            {
                Func <XkcdTile, Image> TileToImage = tile => new Image {
                    Source = XkcdTile.ToImageSource(tile)
                };

                var grid = new UniformGrid {
                    Rows = 2, Columns = 2
                };
                grid.Children.Add(TileToImage(topLeftTile));
                grid.Children.Add(TileToImage(topRightTile));
                grid.Children.Add(TileToImage(bottomLeftTile));
                grid.Children.Add(TileToImage(bottomRightTile));

                var viewBox = new Viewbox();
                viewBox.Child = grid;

                viewBox.Measure(new System.Windows.Size(XkcdTile.Width, XkcdTile.Height));
                viewBox.Arrange(new Rect(new System.Windows.Size(XkcdTile.Width, XkcdTile.Height)));

                var renderTarget = new RenderTargetBitmap(XkcdTile.Width, XkcdTile.Height, 96, 96, PixelFormats.Default);
                renderTarget.Render(viewBox);

                var frame   = BitmapFrame.Create(renderTarget);
                var encoder = new PngBitmapEncoder {
                    Frames = new[] { frame }
                };

                using (var fileStream = targetFile.Create())
                {
                    encoder.Save(fileStream);
                }
            }
        }
示例#30
0
        /// <summary>
        /// Render a Visual to a render target of a fixed size. The visual is
        /// scaled uniformly to fit inside the specified size.
        /// </summary>
        /// <param name="visual"></param>
        /// <param name="height"></param>
        /// <param name="width"></param>
        /// <returns></returns>
        private static RenderTargetBitmap RenderVisual(Visual visual, double height, double width)
        {
            // Default dpi settings
            const double dpiX = 96;
            const double dpiY = 96;

            // We can only render UIElements...ContentPrensenter to
            // the rescue!
            var presenter = new ContentPresenter {
                Content = visual
            };

            // Ensure the final visual is of the known size by creating a viewbox
            // and adding the visual as its child.
            var viewbox = new Viewbox {
                MaxWidth  = width,
                MaxHeight = height,
                Stretch   = Stretch.Uniform,
                Child     = presenter
            };

            // Force the viewbox to re-size otherwise we wont see anything.
            var sFinal = new Size(viewbox.MaxWidth, viewbox.MaxHeight);

            viewbox.Measure(sFinal);
            viewbox.Arrange(new Rect(sFinal));
            viewbox.UpdateLayout();

            // Render the final visual to a render target
            var renderTarget = new RenderTargetBitmap(
                (int)width, (int)height, dpiX, dpiY, PixelFormats.Pbgra32);

            renderTarget.Render(viewbox);

            // Return the render taget with the visual rendered on it.
            return(renderTarget);
        }