【发布时间】:2010-06-04 20:02:08
【问题描述】:
我正在尝试从我的 WPF 应用程序的一部分创建 JPG。像截图一样,仅限个人UIElements。我从这里开始:http://www.grumpydev.com/2009/01/03/taking-wpf-screenshots/
我正在使用他的扩展方法,它允许您使用UIElement.GetJpgImage() 获得一个字节[]。然后可以使用文件流将其写入 JPG 图像。如果我制作整个窗口的 JPG,它看起来就好了!然而,这并不理想,因为它只是捕捉用户所看到的。由于滚动查看器或由于其父对象被动画到小尺寸而不可见的事物将不会显示。
如果我对用于布局的网格进行“截图”: alt text http://img697.imageshack.us/img697/4233/fullscreenshot2.jpg
我得到了这个黑色背景的废话。我不想那样。此外,如果我使用动画折叠了这个网格的高度,我将一无所获。这些实际上是模板复选框,它们上面应该有黑色文本,并且网格的背景应该是白色的。这是其他人编写的用于返回写入文件流的 byte[] 数组的代码:
public static byte[] GetJpgImage(this UIElement source, double scale, int quality)
{
double actualHeight = source.RenderSize.Height;
double actualWidth = source.RenderSize.Width;
double renderHeight = actualHeight * scale;
double renderWidth = actualWidth * scale;
RenderTargetBitmap renderTarget = new RenderTargetBitmap((int) renderWidth, (int) renderHeight, 96, 96, PixelFormats.Pbgra32);
VisualBrush sourceBrush = new VisualBrush(source);
DrawingVisual drawingVisual = new DrawingVisual();
DrawingContext drawingContext = drawingVisual.RenderOpen();
using (drawingContext)
{
drawingContext.PushTransform(new ScaleTransform(scale, scale));
drawingContext.DrawRectangle(sourceBrush, null, new Rect(new Point(0, 0), new Point(actualWidth, actualHeight)));
}
renderTarget.Render(drawingVisual);
JpegBitmapEncoder jpgEncoder = new JpegBitmapEncoder();
jpgEncoder.QualityLevel = quality;
jpgEncoder.Frames.Add(BitmapFrame.Create(renderTarget));
Byte[] _imageArray;
using (MemoryStream outputStream = new MemoryStream())
{
jpgEncoder.Save(outputStream);
_imageArray = outputStream.ToArray();
}
return _imageArray;
}
在那里的某个地方,我们得到了黑色背景。有什么见解吗?
编辑:如果我将网格的背景属性设置为白色,屏幕截图会按预期显示。但是,设置我需要截屏的所有内容的背景是不可行的。
【问题讨论】:
标签: c# wpf wpf-controls screenshot uielement