Я сейчас работаю с wpf. Я создаю кнопку для экспорта изображения в файл PNG. Код как показано ниже: xaml
<Window x:Class="ImageDownload.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:ImageDownload"
mc:Ignorable="d"
Title="ImageDemo" Height="450" Width="800">
<StackPanel>
<Button x:Name="DownloadButton_1" Margin="10" Click="DownloadButton_Click">Download as Image</Button>
<Image x:Name="canvas" Source="Googlelogo.png" Stretch="Uniform" />
</StackPanel>
</Window>
код позади
private void DownloadButton_Click(object sender, RoutedEventArgs e)
{
try
{
SaveFileDialog saveDialog = new SaveFileDialog();
saveDialog.Filter = "Png Image(*.PNG)|*.png";
if (saveDialog.ShowDialog().Value == true)
{
// Save current canvas transform
Transform transform = canvas.LayoutTransform;
// reset current transform (in case it is scaled or rotated)
canvas.LayoutTransform = null;
// Get the size of canvas
Size size = new Size(canvas.ActualWidth, canvas.ActualHeight);
// Measure and arrange the surface
// VERY IMPORTANT
canvas.Measure(size);
canvas.Arrange(new Rect(size));
// Create a render bitmap and push the surface to it
RenderTargetBitmap renderBitmap =
new RenderTargetBitmap(
(int)size.Width,
(int)size.Height,
96d,
96d,
PixelFormats.Default);
renderBitmap.Render(canvas);
BitmapEncoder encoder = new BmpBitmapEncoder();
string extension = saveDialog.FileName.Substring(saveDialog.FileName.LastIndexOf('.'));
encoder = new PngBitmapEncoder();
// push the rendered bitmap to it
encoder.Frames.Add(BitmapFrame.Create(renderBitmap));
// Create a file stream for saving image
using (FileStream fs = File.Open(saveDialog.FileName, FileMode.OpenOrCreate))
{
encoder.Save(fs);
}
// Restore previously saved layout
canvas.LayoutTransform = transform;
}
}
catch (Exception)
{
throw;
}
}
Когда я отлаживаю, окно выглядит следующим образом:
Однако, когда я нажимаю кнопку загрузки и успешно экспортирую изображение в файл png, положение изображения смещается следующим образом:
После некоторого устранения неполадок я обнаружил, что эта строка вызывает проблему:
canvas.Arrange(new Rect(size));
Но если я удалю эту строку, мой png-файл будет обрезан внизу, как показано ниже:
Может кто-нибудь посоветовать мне, как решить эту проблему?
Заранее спасибо