C#学习教程:WPF使用C#从UIElement捕获JPG就像屏幕截图一样,只有单个UIElements。我从这里开始:http://www.grumpydev.com/2009/01/03/taking-wpf-screenshots/我正在使用他的扩展方法,它允许您使用UIElement.GetJpgImage()获取字节[]。然后可以使用文件流将其写入JPG图像。如果我制作整个窗口的JPG,它看起来不错!然而,这并不理想,因为它只捕获用户看到的内容。由于滚动查看器或其父级动画尺寸过小而无法显示的内容。如果我截取一个“屏幕截图”,例如我用于布局的网格:alttexthttp://img697.imageshack.us/img697/4233/fullscreenshot2.jpg我得到这个带有黑色背景的垃圾。我不想要那个。另外,如果我使用动画折叠这个网格的高度,我什么也得不到。这些实际上是模板化的复选框,它们上面应该有黑色文本,网格的背景应该是白色的。这是其他人写的代码,用于返回写入文件流的byte[]组:publicstaticbyte[]GetJpgImage(thisUIElementsource,doublescale,intquality){doubleactualHeight=source.RenderSize.Height;doubleactualWidth=source.RenderSize.Width;双renderHeight=actualHeight*scale;双渲染宽度=实际宽度*比例;RenderTargetBitmaprenderTarget=newRenderTargetBitmap((int)renderWidth,(int)renderHeight,96,96,PixelFormats.Pbgra32);VisualBrushsourceBrush=newVisualBrush(源);DrawingVisualdrawingVisual=newDrawingVisual();DrawingContextdrawingContext=drawingVisual.RenderOpen();使用(drawingContext){drawingContext.PushTransform(newScaleTransform(scale,scale));drawingContext.DrawRectangle(sourceBrush,null,newRect(newPoint(0,0),newPoint(actualWidth,actualHeight)));}renderTarget.Render(drawingVisual);JpegBitmapEncoderjpgEncoder=newJpegBitmapEncoder();jpgEncoder.QualityLevel=质量;jpgEncoder.Frames.Add(BitmapFrame.Create(渲染目标));字节[]_imageArray;使用(MemoryStreamoutputStream=newMemoryStream()){jpgEncoder.Save(outputStream);_imageArray=outputStream.ToArray();}返回_imageArray;在那里的某个地方,我们得到了关于黑色背景的任何见解?编辑:如果我将网格的背景属性设置为白色,屏幕截图将按预期显示。但是,设置我需要截图的所有背景是不可行的。只是猜测,我认为黑色背景将代表字节数组中未在进程中设置任何内容的部分。数组中的初始零将以黑色显示。为避免这种情况,我建议使用值0xFF(byte.MaxValue)初始化数组。更新:仔细观察,我认为您应该在渲染UI元素之前在图像上绘制一个白色矩形。无论如何,这应该有效。就在这行代码之前drawingContext.DrawRectangle(sourceBrush,null,newRect(newPoint(0,0),newPoint(actualWidth,actualHeight)));像这样的drawingContext.DrawRectangle(Brushes.White,null,newRect(newPoint(0,0),newPoint(actualWidth,actualHeight)));不幸的是,唯一可行的方法是在XAML中设置元素的背景。我不想这样做,但我认为这是我在这种情况下需要做的。不管怎样,谢谢你的建议。以上就是C#学习教程:WPF使用C#从UIElement中抓取所有JPG分享的内容。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。涉及侵权,请点击维权联系管理员删除。如需转载请注明出处:
