使用Java将网页转换为JPEG图像

5
我正在使用Java构建一个Web应用程序,如果我提供网页的URL作为输入,我希望能够获取整个网页的屏幕截图。
我的基本想法是捕获呈现组件的显示缓冲区。但是,我不知道如何做到这一点。请帮忙解决。
2个回答

3

我在这个应用程序中使用了一个小技巧:

倒计时演示应用程序 http://img580.imageshack.us/img580/742/capturadepantalla201004wd.png Java应用程序,以blog.stackoverflow.com页面为特色(点击图像查看演示视频)

问题是你需要有一台专门的机器来完成这个任务。

所以,这个技巧非常简单。

  • 创建一个应用程序,将要获取的URL作为参数传递。

  • 然后使用Desktop.open( url )打开它,这将触发当前的网页浏览器。

  • 最后使用java.awt.Robot拍摄屏幕截图并保存到磁盘中。

类似于以下内容:

 class WebScreenShot {
     public static void main( String [] args ) {
         Desktop.getDesktop().open( args[0] );
         Robot robot = new Robot();
         Image image = robot.createScreenCapture( getScreenResolutionSize() );
         saveToDisk( image );
     }
  }

这个解决方案并不完美,因为它需要整个操作系统,但如果你可以有一个专门用于此应用程序的虚拟机,那么你可以轻松地爬取网页并截取屏幕截图。然而,将此应用程序作为非侵入式应用程序存在的问题是,迄今为止,Java没有一个好的HTML引擎渲染器。

请注意,此功能在无头服务器上不可用。 - BalusC
@Balusc 是的,实际上我将其作为一个独立应用程序运行了。 - OscarRyz

3

如果需要一个纯Java的解决方案,可以使用支持并发渲染的Java HTML4/CSS2浏览器,例如Cobra,它提供了一个Swing组件用于GUI。当您实例化此组件时,可以调用其paint(Graphics g)方法将其绘制到屏幕外图像中。

E.g.
Component c = ...; // the browser component
BufferedImage bi = new BufferedImage(c.getWidth(), c.getHeight(), TYPE_INT_RGB)
Graphics2d g = bi.createGraphics();    
c.paint(g);

你可以使用Java图像API将其保存为JPG格式。
JPEGImageEncoder encoder = JPEGCodec.createEncoder(new FileOutputStream("screen.jpg"));
enncoder.encode(bi);  // encode the buffered image

基于Java的浏览器通常与已经成熟的本地浏览器相比较逊。然而,如果你的目标是静态图像,而不是交互式浏览器,那么基于Java的浏览器在这方面可能已经足够了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接