4

我正在尝试从我的 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;
}

在那里的某个地方,我们得到了一个黑色的背景。有什么见解吗?

编辑:如果我将网格的背景属性设置为白色,屏幕截图会按预期出现。但是,设置我需要截屏的所有背景是不可行的。

4

2 回答 2

6

只是一个猜测,我认为黑色背景将代表字节数组的一部分,这些部分在此过程中未设置为任何内容。数组中的初始零将显示为黑色。

为避免这种情况,我建议使用 0xFF (byte.MaxValue) 值初始化数组。

更新:

从更近的角度来看,我认为您应该在渲染 UI 元素之前在图像上绘制一个白色矩形。无论如何,这应该可以工作。

就在这行代码之前

drawingContext.DrawRectangle(sourceBrush, null, new Rect(new Point(0, 0), new Point(actualWidth, actualHeight))); 

放这样的东西

drawingContext.DrawRectangle(Brushes.White, null, new Rect(new Point(0, 0), new Point(actualWidth, actualHeight))); 
于 2010-06-04T20:05:52.173 回答
0

不幸的是,唯一有效的方法就是在 XAML 中设置元素的背景。我不想这样做,但我想这是我在这种情况下需要做的。无论如何感谢您的建议。

于 2010-06-07T14:01:39.007 回答