Сохранение изображений в UniformGrid в WPF

Мне нужно сохранить изображения, которые у меня есть в UniformGrid, Это возможно или нет? Я использую UniformGrid, потому что, если я расширяю окно, изображение адаптируется к размеру UniformGrid (несет ответственность). У вас есть идеи, пожалуйста?

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;
    }
}
Другие вопросы по тегам