3

这件事一直让我发疯。

我有一个 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图表

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

我试过这个: 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/

这: 从控制视图中获取位图图像

和 ervey 对这篇文章的建议: 如何使用 JpegBitmapEncoder 保存图像

或这个: 将 WPF InkCanvas 保存为 JPG - 图像被裁剪

以及我脑海中闪过的一切,但结果还是一样。

一定有什么我忽略了,但我不知道它是什么。

4

2 回答 2

2

To sum up comments this seems to be a background issue as PNG, attached to this question, has everything transparent apart from chart lines and since JPEG does not support transparency all that is transparent will be black.

Simpliest solution would be to set background of chart to some color

于 2014-06-18T09:03:15.803 回答
-1

免责声明:我在资源问题中为 ImageSource 中的 System.Drawing.Image 提供了这个答案,并打算投票关闭这个问题作为另一个问题的副本,但因为问题作者不接受答案而不能。

在 WPF 中,每个 UI 元素都扩展了在 WPF中提供渲染支持的Visual。还有一个,它有一个将对象作为输入参数的方法。因此,您可以将您的属性设置为 an并简单地将其渲染为图像:RenderTargetBitmapRenderVisualImageSourceSourceImageImageBitmap

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);    
}

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


更新>>>

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

int width = 128;
int height = width;
int stride = width / 8;
byte[] pixels = new byte[height * stride];

// Define the image palette
BitmapPalette myPalette = BitmapPalettes.Halftone256;

// Creates a new empty image with the pre-defined palette
BitmapSource image = BitmapSource.Create(
    width,
    height,
    96,
    96,
    PixelFormats.Indexed1,
    myPalette,
    pixels,
    stride);

FileStream stream = new FileStream("new.jpg", FileMode.Create);
JpegBitmapEncoder encoder = new JpegBitmapEncoder();
TextBlock myTextBlock = new TextBlock();
myTextBlock.Text = "Codec Author is: " + encoder.CodecInfo.Author.ToString();
encoder.FlipHorizontal = true;
encoder.FlipVertical = false;
encoder.QualityLevel = 30;
encoder.Rotation = Rotation.Rotate90;
encoder.Frames.Add(BitmapFrame.Create(image));
encoder.Save(stream);

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

于 2014-06-11T13:39:25.733 回答