我正在使用xBim工具包(http://docs.xbim.net/)进行3D对象渲染,并且需要在单击按钮时创建当前场景的屏幕截图。 xBim将画布用于对象的图形表示。 整个项目基于C#、. NET工具和Javascript,因此这是可用于解决此问题的工具范围。
我已经尝试使用html2canvas(https://html2canvas.hertzen.com/)和dom-to-image(https://github.com/tsayen/dom-to-image)库,但也尝试使用默认的canvas方法(例如myCanvas.toDataUrl()或myCanvas.toBlob ())。 它们全都只产生具有黑色或白色背景的空图像,但没有保存xBim对象。
获取任何有用的屏幕截图的唯一方法是使用System.Drawing.Graphics,然后创建整个屏幕的屏幕截图(出于多种原因,这并不是最佳的实现方式。)
public static void MakeScreenshot()
{
var x = Math.Abs(WebBrowser.MousePosition.X);
var y = Math.Abs(WebBrowser.MousePosition.Y);
var bounds = Screen.FromPoint(new Point(x, y)).Bounds;
Bitmap bitmap = new Bitmap(bounds.Width, bounds.Height);
Graphics graphics = Graphics.FromImage(bitmap as System.Drawing.Image);
graphics.CopyFromScreen(25, 25, 25, 25, bitmap.Size);
string screenshotFilePath = Path.Combine(DirectoryPath, "Screenshot.jpg");
bitmap.Save(screenshotFilePath, ImageFormat.Jpeg);
}
我只想拥有画布区域的屏幕截图。 通过使用Javascript或C#代码(即使使用System.Drawing.Graphics,但仅剪切一部分屏幕)来实现它并不重要
答案 0 :(得分:0)
如果按照问题所述使用xBim Toolkit,则需要在内部使用WebGL进行对象表示以了解它。 为了在运行WebGl时截取屏幕截图,我找到了一种方法(不确定它是否是最好的方法,但是可以用)。 您可以在加载页面和xBim Viewer之前执行以下Javascript代码:
HTMLCanvasElement.prototype.getContext = function (origFn) {
return function (type, attributes) {
if (type === 'webgl') {
attributes = Object.assign({}, attributes, {
preserveDrawingBuffer: true,
});
}
return origFn.call(this, type, attributes);
};
}(HTMLCanvasElement.prototype.getContext);
它应该保留绘图缓冲区,并使您能够以某些已知方式获取屏幕截图,例如使用dom到图像库:
domtoimage.toJpeg(document.getElementById('canvas'), { quality: 0.95 })
.then(function (dataUrl) {
var link = document.createElement('a');
link.download = 'Screenshot.jpeg';
link.href = dataUrl;
link.click();
});