从图像控制保存图像不起作用
本文关键字:图像 不起作用 保存 控制 | 更新日期: 2023-09-27 18:34:51
我的GUI上有一个图像(框架元素(。里面有一幅图像。现在我正在双击此图像,我想要,图像会自行保存,并将使用默认图像查看器打开。
我的代码:
void image_MouseDown(object sender, MouseButtonEventArgs e)
{
//Wayaround, cause there is no DoubleClick Event on Image
if (e.ChangedButton == MouseButton.Left && e.ClickCount == 2)
{
SaveToPng(((Image)sender), "SavedPicture.png");
Process.Start("SavedPicture.png");
}
}
void SaveToPng(FrameworkElement visual, string fileName)
{
var encoder = new PngBitmapEncoder();
SaveUsingEncoder(visual, fileName, encoder);
}
void SaveUsingEncoder(FrameworkElement visual, string fileName, BitmapEncoder encoder)
{
RenderTargetBitmap bitmap = new RenderTargetBitmap(
(int)visual.ActualWidth,
(int)visual.ActualHeight,
96,
96,
PixelFormats.Pbgra32);
bitmap.Render(visual);
BitmapFrame frame = BitmapFrame.Create(bitmap);
encoder.Frames.Add(frame);
using (var stream = File.Create(fileName))
{
encoder.Save(stream);
}
}
打开图片可以正常工作Process.Start
.问题是保存,它保存了图片:SavedPicture.png
但是,它只是黑色的,所以没有图形。也许有人可以告诉我,我的代码中出了什么问题,或者知道在 WPF 中保存图像的更好方法。
在
保存图像之前,必须显示图像。因此,如果要使用RenderTargetBitmap
只需设置Image.Source
并加载Image
,然后再使用SaveToPng
保存(ActualWidth
和ActualHeight
不得为空(。
示例:
如果您在Panel
内有Image
:
<Grid x:Name="MyGrid">
<Image x:Name="MyImage"/>
</Grid>
我在测试类构造函数中设置了Image.Source
,只有在加载图像后我才保存它:
public MainWindow()
{
InitializeComponent();
BitmapImage bmp = new BitmapImage();
bmp.BeginInit();
bmp.UriSource = new Uri("image.png", UriKind.RelativeOrAbsolute);
bmp.EndInit();
MyImage.Source = bmp;
}
private void Window_Loaded(object sender, RoutedEventArgs e)
{
RenderTargetBitmap bmp = new RenderTargetBitmap((int)MyGrid.ActualWidth,
(int)MyGrid.ActualHeight, 96, 96, PixelFormats.Default);
bmp.Render(MyImage);
PngBitmapEncoder encoder = new PngBitmapEncoder();
encoder.Frames.Add(BitmapFrame.Create(bmp));
using (var stream = System.IO.File.Create("newimage.png"))
{ encoder.Save(stream); }
}
如果您不想使用Grid
ActualWidth
和ActualHeight
只需传递您的 with 和 height 作为参数。
取决于 Image.Source 的类型,假设您有一个 BitmapSource,如本文所示,它应该遵循以下行:
var encoder = new PngBitmapEncoder();
encoder.Frames.Add(BitmapFrame.Create((BitmapSource)image.Source));
using (FileStream stream = new FileStream(filePath, FileMode.Create))
encoder.Save(stream);
顺便说一下,RenderTargetBitmap类是将Visual 对象转换为位图。
样本http://msdn.microsoft.com/en-us/library/aa969819.aspx
问题解决了。
我用了这个:File.WriteAllBytes()
从二进制格式保存图像