【问题标题】:Saving Images in UniformGrid in WPF在 WPF 中的 UniformGrid 中保存图像
【发布时间】:2017-06-21 00:28:24
【问题描述】:

我需要保存UniformGrid 中的图像。有没有可能? 我正在使用 UniformGrid,因为如果我正在扩展 Window,Image 会适应 UniformGrid 大小(负责)。请问您有什么想法吗?

【问题讨论】:

    标签: c# wpf image uniformgrid


    【解决方案1】:

    WinForms 中可以选择将System.Drawing.Image 直接保存到文件中,如下所示:

    MyImage.Save("C:\\myBitmap.bmp");
    

    据我所知,这在 WPF 中是不可能的。但是还有一种更动态的方式,使用RenderTargetBitmap,您可以将任何视觉元素以图像的形式保存。

    在这个问题中:

    Save content of a visual Object as a image file in WPF?

    我找到了允许在 JPG 中保存视觉元素的方法。我将它们组合成一个静态类WorkWithImages

    public static class WorkWithImages 
    {
        public static RenderTargetBitmap ConvertToBitmap(UIElement uiElement, double resolution)
        {
            var scale = resolution / 96d;
            uiElement.Measure(new Size(Double.PositiveInfinity, Double.PositiveInfinity));
            var sz = uiElement.DesiredSize;
            var rect = new Rect(sz);
            uiElement.Arrange(rect);
            var bmp = new RenderTargetBitmap((int)(scale * (rect.Width)), (int)(scale * (rect.Height)), scale * 96, scale * 96, PixelFormats.Default);
            bmp.Render(uiElement);
    
            return bmp;
        }
    
        public static void ConvertToJpeg(UIElement uiElement, string path, double resolution)
        {
            var jpegString = CreateJpeg(ConvertToBitmap(uiElement, resolution));
    
            if (path != null)
            {
                try
                {
                    using (var fileStream = File.Create(path))
                    {
                        using (var streamWriter = new StreamWriter(fileStream, Encoding.Default))
                        {
                            streamWriter.Write(jpegString);
                            streamWriter.Close();
                        }
    
                        fileStream.Close();
                    }
                }
    
                catch (Exception ex)
                {
                    //TODO: handle exception here
                }
            }
        }
    
        private static string CreateJpeg(RenderTargetBitmap bitmap)
        {
            var jpeg = new JpegBitmapEncoder();
            jpeg.Frames.Add(BitmapFrame.Create(bitmap));
            string result;
    
            using (var memoryStream = new MemoryStream())
            {
                jpeg.Save(memoryStream);
                memoryStream.Seek(0, SeekOrigin.Begin);
    
                using (var streamReader = new StreamReader(memoryStream, Encoding.Default))
                {
                    result = streamReader.ReadToEnd();
                    streamReader.Close();
                }
    
                memoryStream.Close();
            }
    
            return result;
        }
    }
    

    这是一个完整的例子:

    XAML

    <Grid>
        <Label Name="TestLabel"
               Content="Test" 
               Width="100" 
               Height="100"
               HorizontalContentAlignment="Center"
               VerticalContentAlignment="Center"
               Background="Beige" />
    
        <StackPanel>
            <Button Name="SaveToJpgButton"
                    Width="100" 
                    Height="30" 
                    Content="SaveToJpg"
                    Click="SaveToJpg_Click" />
        </StackPanel>
    </Grid>
    

    Code-behind

    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }
    
        private void SaveToJpg_Click(object sender, RoutedEventArgs e)
        {
            WorkWithImages.ConvertToJpeg(TestLabel, "TestLabel.jpg", 132);
        }       
    }
    
    public static class WorkWithImages 
    {
        public static RenderTargetBitmap ConvertToBitmap(UIElement uiElement, double resolution)
        {
            var scale = resolution / 96d;
            uiElement.Measure(new Size(Double.PositiveInfinity, Double.PositiveInfinity));
            var sz = uiElement.DesiredSize;
            var rect = new Rect(sz);
            uiElement.Arrange(rect);
            var bmp = new RenderTargetBitmap((int)(scale * (rect.Width)), (int)(scale * (rect.Height)), scale * 96, scale * 96, PixelFormats.Default);
            bmp.Render(uiElement);
    
            return bmp;
        }
    
        public static void ConvertToJpeg(UIElement uiElement, string path, double resolution)
        {
            var jpegString = CreateJpeg(ConvertToBitmap(uiElement, resolution));
    
            if (path != null)
            {
                try
                {
                    using (var fileStream = File.Create(path))
                    {
                        using (var streamWriter = new StreamWriter(fileStream, Encoding.Default))
                        {
                            streamWriter.Write(jpegString);
                            streamWriter.Close();
                        }
    
                        fileStream.Close();
                    }
                }
    
                catch (Exception ex)
                {
                    //TODO: handle exception here
                }
            }
        }
    
        private static string CreateJpeg(RenderTargetBitmap bitmap)
        {
            var jpeg = new JpegBitmapEncoder();
            jpeg.Frames.Add(BitmapFrame.Create(bitmap));
            string result;
    
            using (var memoryStream = new MemoryStream())
            {
                jpeg.Save(memoryStream);
                memoryStream.Seek(0, SeekOrigin.Begin);
    
                using (var streamReader = new StreamReader(memoryStream, Encoding.Default))
                {
                    result = streamReader.ReadToEnd();
                    streamReader.Close();
                }
    
                memoryStream.Close();
            }
    
            return result;
        }
    }
    

    【讨论】:

    • 非常感谢:)太棒了!
    猜你喜欢
    • 2015-11-02
    • 2010-12-24
    • 2015-04-29
    • 1970-01-01
    • 1970-01-01
    • 2011-05-24
    • 2013-01-08
    • 1970-01-01
    • 2014-06-11
    相关资源
    最近更新 更多