如何以编程方式创建给定网站的屏幕截图?

Posted

技术标签:

【中文标题】如何以编程方式创建给定网站的屏幕截图?【英文标题】:How can I programmatically create a screen shot of a given Web site? 【发布时间】:2010-10-20 05:10:34 【问题描述】:

我希望能够创建给定网站的屏幕截图,但该网站可能比屏幕上显示的要大。有什么办法可以做到吗?

目标是在 WinForms 应用程序中使用 C# 中的 .NET 实现此目的。

【问题讨论】:

有人想将其作为服务器端脚本,但我需要一个 WinForms 应用程序。 【参考方案1】:

有一些工具。

问题是,您需要在某个给定的程序中渲染它,并拍摄它的快照。 我不了解 .NET,但这里有一些工具可供参考。

Khtml2PNG imagegrabwindow()(仅限 Windows php) Create screenshots of a web page using Python and QtWebKit Website Thumbnails Service Taking automated webpage screenshots with embedded Mozilla

【讨论】:

【参考方案2】:

我刚刚发现了网站 browsershots.org,它可以为一大堆不同的浏览器生成屏幕截图。在某种程度上,您甚至可以指定分辨率。

【讨论】:

【参考方案3】:

我在 VB.NET 中编写了一个程序,可以按照您的要求完成,除了屏幕尺寸问题。

我在表单中嵌入了一个 Web 控件(查看所有控件的最底部),并调整了它的设置(隐藏滚动)。我使用计时器等待动态内容,然后使用“copyFromScreen”获取图像。

我的程序有动态尺寸(可通过命令行设置)。我发现如果我的程序比屏幕大,图像只会返回屏幕外区域的黑色像素。因为那时我的工作已经完成,所以我没有进一步研究。

希望能给你一个好的开始。对不起,任何错误的措辞。我每隔几个月才登录一次 Windows 开发。

【讨论】:

【参考方案4】:

将 at 作为屏幕截图可能会变得丑陋。使用 wget 捕获页面的全部内容很容易,但是图像意味着捕获渲染。

这是some tools,声称要这样做。

【讨论】:

【参考方案5】:

您可以在 WebBrowser 控件上呈现它,然后拍摄快照,如果页面尺寸大于屏幕尺寸,您必须滚动控件拍摄一张或多张快照,然后合并所有图片:)

【讨论】:

【参考方案6】:

这是以编程方式创建屏幕截图的代码:

using System.Drawing.Imaging; int screenWidth = Screen.GetBounds(new Point(0, 0)).Width; int screenHeight = Screen.GetBounds(new Point(0, 0)).Height; Bitmap bmpScreenShot = new Bitmap(screenWidth, screenHeight); Graphics gfx = Graphics.FromImage((Image)bmpScreenShot); gfx.CopyFromScreen(0, 0, 0, 0, new Size(screenWidth, screenHeight)); bmpScreenShot.Save("test.jpg", ImageFormat.Jpeg);

【讨论】:

-1 这是用户桌面的屏幕截图,而不是网站的屏幕截图【参考方案7】:

网站的 Java 屏幕截图

Combine Screens 一起为最终的整个网页截图。

public static void main(String[] args) throws FileNotFoundException, IOException 
        System.setProperty("webdriver.chrome.driver", "D:\\chromedriver.exe");
        ChromeDriver browser = new ChromeDriver();  
        WebDriver driver = browser;
        driver.get("https://news.google.co.in/");
        driver.manage().timeouts().implicitlyWait(500, TimeUnit.SECONDS);

        javascriptExecutor jse = (JavascriptExecutor) driver;
        Long clientHeight = (Long) jse.executeScript("return document.documentElement.clientHeight");
        Long scrollHeight = (Long) jse.executeScript("return document.documentElement.scrollHeight");
        int screens = 0, xAxis = 0, yAxis = clientHeight.intValue();
        String screenNames = "D:\\Screenshots\\Yash";
        for (screens = 0; ; screens++) 
            if (scrollHeight.intValue() - xAxis < clientHeight) 
                File crop = new File(screenNames + screens+".jpg");
                FileUtils.copyFile(browser.getScreenshotAs(OutputType.FILE), crop);                 

                BufferedImage image = ImageIO.read(new FileInputStream(crop));            
                int y_Axixs = scrollHeight.intValue() - xAxis;
                BufferedImage croppedImage = image.getSubimage(0, image.getHeight()-y_Axixs, image.getWidth(), y_Axixs);
                ImageIO.write(croppedImage, "jpg", crop);               
                break;
                           

FileUtils.copyFile(browser.getScreenshotAs(OutputType.FILE), new File(screenNames + screens+".jpg")); 
 jse.executeScript("window.scrollBy("+ xAxis +", "+yAxis+")");

                jse.executeScript("var elems = window.document.getElementsByTagName('*');"                              
                        + "     for(i = 0; i < elems.length; i++)  "
                        + "         var elemStyle = window.getComputedStyle(elems[i], null);"
                        + "         if(elemStyle.getPropertyValue('position') == 'fixed' && elems[i].innerHTML.length != 0 )"                                                                  
                        + "             elems[i].parentNode.removeChild(elems[i]); "                                
                        + "");    // Sticky Content Removes
                xAxis += yAxis;
        
        driver.quit();
    

【讨论】:

以上是关于如何以编程方式创建给定网站的屏幕截图?的主要内容,如果未能解决你的问题,请参考以下文章

如何以编程方式截取可扩展的uitableview的屏幕截图

如何以编程方式获取 android 设备屏幕截图? [复制]

我如何同时传递 x 和 y 轴以及屏幕的高度和宽度以快速以编程方式截取屏幕截图

如何以编程方式关闭/禁用 iOS 11 中引入的屏幕截图弹出框?

您如何以编程方式在 Android ICS 及更高版本上截取屏幕截图?

以编程方式截取特定区域的屏幕截图