我正在尝试从我的 WPF 应用程序的一部分创建 JPG。像截图一样,只有个别UIElement
的。我从这里开始: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;
}
在那里的某个地方,我们得到了一个黑色的背景。有什么见解吗?
编辑:如果我将网格的背景属性设置为白色,屏幕截图会按预期出现。但是,设置我需要截屏的所有背景是不可行的。