这件事让我发疯了。
我有一张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();
我得到这样的东西:
但现在我还需要将其导出为JPEG格式。我认为这很简单,只需更换编码器,但这就是我得到的:
并且: 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
以及我想到的其他一切,但结果仍然相同。
必须有一些我忽视的东西,但我不知道它是什么。
答案 0 :(得分:2)
总结评论这似乎是一个背景问题,因为PNG附加到这个问题,除了图表线之外,所有内容都是透明的,因为JPEG不支持透明度,所有透明的都是黑色的。
最简单的解决方案是将图表背景设置为某种颜色
答案 1 :(得分:-1)
免责声明:我为System.Drawing.Image from ImageSource in Resources问题提供了这个答案,并打算投票将此问题视为另一个问题的副本,但无法解决,因为问题的作者并不接受答案。
在WPF中,每个UI元素都扩展了Visual
Class 在WPF中提供渲染支持。还有一个RenderTargetBitmap
Class,其Render
Method将Visual
个对象作为输入参数。因此,您可以将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);
}
如果您有任何问题,请告诉我。