Сохранение изображений в 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;
}
}