1

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

4

1 回答 1

1

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

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

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

在这个问题中:

将可视对象的内容保存为 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;
    }
}
于 2014-02-23T13:48:14.840 回答