0

我的 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 中保存图像的更好方法。

4

3 回答 3

1

图像必须在保存前显示。因此,如果您想使用RenderTargetBitmap,只需设置并在保存之前Image.Source加载(并且不能为空)。ImageSaveToPngActualWidthActualHeight

示例

如果您有Image内部 a Panel

<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 作为参数传递。

于 2012-05-22T11:07:21.097 回答
0

取决于 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

于 2012-05-22T12:11:05.527 回答
0

问题解决了。

我用这个:File.WriteAllBytes() 从二进制格式保存图像

于 2012-05-29T08:38:14.430 回答