【发布时间】:2014-06-18 17:03:15
【问题描述】:
这件事让我发疯了。
我有一个 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
以及我脑海中闪过的一切,但结果还是一样。
一定有什么我忽略了,但我不知道它是什么。
【问题讨论】:
-
您是否尝试将图表背景设置为白色?似乎是透明度问题。如果不可能,请尝试将图表放置在背景为白色(或您所期望的)的边框中,然后为图像渲染边框。
-
@memoryofadream 我已经检查了您附加到这个问题的 PNG,除了图表线之外的所有内容都是透明的,并且由于 JPEG 不支持透明度,所有透明的都是黑色的。将背景设置为某种颜色
-
我感受到了你的痛苦,在那里做过。我的解决方案是有一个带有所需背景的空白位图(即全蓝色)并在其顶部渲染!它可能不会赢得任何程序员奖项,但它的速度非常快。加上背景渐变位图,看起来半专业。
-
@dkozl 有这么明显的痛苦吗?我什至没有考虑透明度。不幸的是,我要到下周三才能知道,但如果是这样的话,我会告诉你的。我现在真的觉得自己很愚蠢,没有考虑到这一点。
-
@dkozl 看来您设置背景是对的。如果您将此解决方案作为答案提供,我会将其标记为该问题的官方答案。