将WPF可视元素另存为JPEG

时间:2014-06-11 13:20:03

标签: c# wpf encoding visiblox

这件事让我发疯了。

我有一张Visiblox图表。我目前使用以下代码导出为PNG:

    var chart = this.CalibrationChartVisibility == Visibility.Visible ? this.calibrationChart : this.residualChart;


    var transform = chart.LayoutTransform;
    chart.LayoutTransform = null;

    var width = (int)chart.ActualWidth;
    var height = (int)chart.ActualHeight;

    var rtb = new RenderTargetBitmap(width, height, 96, 96, PixelFormats.Pbgra32);
    rtb.Render(chart);

    var encoder = new PngBitmapEncoder();
    encoder.Frames.Add(BitmapFrame.Create(rtb));

    var stream = new MemoryStream();

    encoder.Save(stream);
    stream.Position = 0;

    chart.LayoutTransform = transform;
    return stream.ToArray();

我得到这样的东西: png chart

但现在我还需要将其导出为JPEG格式。我认为这很简单,只需更换编码器,但这就是我得到的: jpg chart

我试过这个: http://social.msdn.microsoft.com/Forums/vstudio/en-US/31ac62d4-399b-4f2e-a9b9-749efe7528b6/rendertargetbitmap-to-file-problem?forum=wpf

并且: http://www.grumpydev.com/2009/01/03/taking-wpf-screenshots/

并且: Get a bitmap image from a Control view

和ervey对这篇文章的消息: How to save image using JpegBitmapEncoder

或者这个: saving WPF InkCanvas to a JPG - image is getting cropped

以及我想到的其他一切,但结果仍然相同。

必须有一些我忽视的东西,但我不知道它是什么。

2 个答案:

答案 0 :(得分:2)

总结评论这似乎是一个背景问题,因为PNG附加到这个问题,除了图表线之外,所有内容都是透明的,因为JPEG不支持透明度,所有透明的都是黑色的。

最简单的解决方案是将图表背景设置为某种颜色

答案 1 :(得分:-1)

  

免责声明:我为System.Drawing.Image from ImageSource in Resources问题提供了这个答案,并打算投票将此问题视为另一个问题的副本,但无法解决,因为问题的作者并不接受答案。

在WPF中,每个UI元素都扩展了Visual Class 在WPF中提供渲染支持。还有一个RenderTargetBitmap Class,其Render MethodVisual个对象作为输入参数。因此,您可以将ImageSource设置为Source的{​​{1}}属性,只需将Image呈现为Image图片:

Bitmap

由于这在互联网上有很好的记录,我不想在这里重复整个故事。要查看完整的故事,请参阅Dot NET Tricks网站上的How to Render Bitmap or to Print a Visual in WPF页面,该页面还可以帮助您满足打印要求。


更新>>>

好的,所以除了您想要使用JpegBitmapEncoder对象之外,大部分内容都以同样的方式适用于您。链接页面中的此示例显示了另一种保存JPEG图像的方法:

Image yourImageObject = new Image();
yourImageObject.Source = yourImageSource;

RenderTargetBitmap renderTargetBitmap = 
    new RenderTargetBitmap(width, height, 96, 96, PixelFormats.Default);
renderTargetBitmap.Render(yourImageObject);

// Save to .png file
PngBitmapEncoder pngBitmapEncoder = new PngBitmapEncoder();    
pngBitmapEncoder.Frames.Add(BitmapFrame.Create(renderTargetBitmap));    
using (Stream stream = File.Create(filepath))    
{    
    pngBitmapEncoder.Save(stream);    
}

如果您有任何问题,请告诉我。