JAVA将HTML转化图片最靠谱的方法
经过比对分析发现使用Java内置的浏览器DJNativeSwing做,是最好的解决方法,下面是源码
用到的包如下:
DJNativeSwing-SWT.jar
DJNativeSwing.jar
org.eclipse.swt.win32.win32.x86_3.102.0.v20130605- 1544.jar (32位)
org.eclipse.swt.win32.win32.x86_64_3.100.1.v4236b.jar
(64位)
public class TestMain extends JPanel { /** * DJNativeSwing-SWT.jar*/ private static final long serialVersionUID = 1L; // 行分隔符 final static public String LS = System.getProperty("line.separator", "/n"); // 文件分割符 final static public String FS = System.getProperty("file.separator", "//"); //以javascript脚本获得网页全屏后大小 final static StringBuffer jsDimension; static { jsDimension = new StringBuffer(); jsDimension.append("var width = 0;").append(LS); jsDimension.append("var height = 0;").append(LS); jsDimension.append("if(document.documentElement) {").append(LS); jsDimension.append( " width = Math.max(width, document.documentElement.scrollWidth);") .append(LS); jsDimension.append( " height = Math.max(height, document.documentElement.scrollHeight);") .append(LS); jsDimension.append("}").append(LS); jsDimension.append("if(self.innerWidth) {").append(LS); jsDimension.append(" width = Math.max(width, self.innerWidth);") .append(LS); jsDimension.append(" height = Math.max(height, self.innerHeight);") .append(LS); jsDimension.append("}").append(LS); jsDimension.append("if(document.body.scrollWidth) {").append(LS); jsDimension.append( " width = Math.max(width, document.body.scrollWidth);") .append(LS); jsDimension.append( " height = Math.max(height, document.body.scrollHeight);") .append(LS); jsDimension.append("}").append(LS); jsDimension.append("return width + ':' + height;"); } //DJNativeSwing组件请于http://djproject.sourceforge<a href="http://lib.csdn.net/base/dotnet" class='replace_word' title=".NET知识库" target='_blank' style='color:#df3434; font-weight:bold;'>.NET</a>/main/index.html下载 public TestMain(final String url, final int maxWidth, final int maxHeight) { super(new BorderLayout()); JPanel webBrowserPanel = new JPanel(new BorderLayout()); final String fileName = System.currentTimeMillis() + ".jpg"; final JWebBrowser webBrowser = new JWebBrowser(null); webBrowser.setBarsVisible(false); webBrowser.navigate(url); webBrowserPanel.add(webBrowser, BorderLayout.CENTER); add(webBrowserPanel, BorderLayout.CENTER); JPanel panel = new JPanel(new FlowLayout(FlowLayout.CENTER, 4, 4)); webBrowser.addWebBrowserListener(new WebBrowserAdapter() { // 监听加载进度 public void loadingProgressChanged(WebBrowserEvent e) { // 当加载完毕时 if (e.getWebBrowser().getLoadingProgress() == 100) { String result = (String) webBrowser .executeJavascriptWithResult(jsDimension.toString()); int index = result == null ? -1 : result.indexOf(":"); NativeComponent nativeComponent = webBrowser .getNativeComponent(); Dimension originalSize = nativeComponent.getSize(); Dimension imageSize = new Dimension(Integer.parseInt(result .substring(0, index)), Integer.parseInt(result .substring(index + 1))); imageSize.width = Math.max(originalSize.width, imageSize.width + 50); imageSize.height = Math.max(originalSize.height, imageSize.height + 50); nativeComponent.setSize(imageSize); BufferedImage image = new BufferedImage(imageSize.width, imageSize.height, BufferedImage.TYPE_INT_RGB); nativeComponent.paintComponent(image); nativeComponent.setSize(originalSize); // 当网页超出目标大小时 if (imageSize.width > maxWidth || imageSize.height > maxHeight) { //截图部分图形 image = image.getSubimage(0, 0, maxWidth, maxHeight); /*此部分为使用缩略图 int width = image.getWidth(), height = image .getHeight(); AffineTransform tx = new AffineTransform(); tx.scale((double) maxWidth / width, (double) maxHeight / height); AffineTransformOp op = new AffineTransformOp(tx, AffineTransformOp.TYPE_NEAREST_NEIGHBOR); //缩小 image = op.filter(image, null);*/ } try { // 输出图像 ImageIO.write(image, "jpg", new File(fileName)); } catch (IOException ex) { ex.printStackTrace(); } // 退出操作 System.exit(0); } } } ); add(panel, BorderLayout.SOUTH); } public static void main(String[] args) { NativeInterface.open(); SwingUtilities.invokeLater(new Runnable() { public void run() { // SWT组件转Swing组件,不初始化父窗体将无法启动webBrowser JFrame frame = new JFrame("以DJ组件保存指定网页截图"); // 加载指定页面,最大保存为640x480的截图 frame.getContentPane().add( new TestMain("http://www.huanqiu.com/", 1024, 768), BorderLayout.CENTER); frame.setSize(1024, 768); // 仅初始化,但不显示 frame.invalidate(); frame.pack(); frame.setVisible(false); } }); NativeInterface.runEventPump(); }
}
JAVA将HTML转化图片最靠谱的方法相关推荐
- qt 中转化图片格式与大小的方法
//将 QImage 转化为 QPixmapQImage img(":/2/enemytank-ico.gif");QPixmap pix;pix=QPixmap::fromIma ...
- java 实现pdf转化为批量图片(两步走)
java 实现pdf转化为批量图片(两步走) 微信小程序先看pdf批量转图片效果 1.导入jar包 方法1:在maven中导入 <dependency><groupId>org ...
- java BASE64流 输出图片。
java BASE64流 输出图片. 亲测3个请求都可用,没有测试性能问题.仅供参考 BASE64Decoder Eclipsse 类可能引用不了解决方案链接:http://blog.csdn.net ...
- JAVA上传文件图片到服务器保存
这里我记录一个比较简单方便操作的JAVA上传文件图片到服务器并且保存! 首先是页面 html的 我这是提交一个文件和类型 <div style="border: 1px solid ...
- Java调用opencv实现图片去水印
opencv实现图片去水印案例 Java调用opencv实现图片去水印 环境安装配置 IDEA下开发配置 测试案例 Java调用opencv实现图片去水印 最近项目中遇到个需求,图片去水印下载,由于上 ...
- java上传文件图片到服务器保存,Java上传文件图片到服务器的方法
这里我记录一个比较简单方便操作的java上传文件图片到服务器并且保存,具体内容如下 首先是页面html的 我这是提交一个文件和类型 我是添加一张临时图片得到微信的media_id保存数据库! en ...
- 【Android 内存优化】Android 原生 API 图片压缩原理 ( 图片质量压缩方法 | 查找 Java 源码中的 native 方法对应的 C++ 源码 )
文章目录 一. 图片质量压缩方法 二. 查找对应的 Native 方法源码 三. 分析 Bitmap.cpp 中动态注册 Native 方法 在博客 [Android 内存优化]图片文件压缩 ( An ...
- JAVA 通过url下载图片保存到本地(亲测)
//java 通过url下载图片保存到本地 public static void download(String urlString, int i) throws Exception { ...
- java主界面设置背景图片_java 窗体设置背景图片问题?(附上登陆界面代码,我想加个背景图片,求大神帮忙改改)...
java 窗体设置背景图片问题?(附上登陆界面代码,我想加个背景图片,求大神帮忙改改) 关注:223 答案:4 mip版 解决时间 2021-01-26 22:09 提问者非莪莫属 2021-01 ...
最新文章
- linux批量创建用户和密码
- git fetch比较差异
- mysql8.0创建属性,MySQL 8.0新特性 — 管理端口的使用简介
- 牛逼!Python常用数据类型的基本操作(长文系列第①篇)
- 首发 | 腾讯把需求和代码统一的内幕
- [C++] 匿名管道的理解与实现
- 2018蓝桥杯省赛---java---A---7(三体攻击)
- 分布式与系统架构的演变
- MAC 安装caffe 教程 排坑
- FusionChartsFree设置指南
- Google浏览器Chrome,永久开启flash支持的办法
- weka与mysql相连_Weka与MySQL连接配置
- BUUCTF Misc wp大合集(1)
- 手把手教你如何将chatgpt接入微信公众号
- JavaScript基础第06天笔记
- pytorch中DataLoader的num_workers
- 中国小三多,是因为女人缺乏精神上的独立,男人缺乏人格上的体面。
- 小程序源码:后台版本趣味测试微信小程序源码下载支持自定义问题等等
- 小明种苹果(100分)
- oracle常用知识,oracle的基本知识
热门文章
- 人类记忆系统之谜,也许就是这么回事儿
- TK教主:和玄武实验室有关的几个故事 | 人物志
- 《Qt编程入门》配套代码下载
- 服务器的安全应该从哪些角度考虑-中了挖矿病毒
- Oozie的安装和使用
- 排坑:运行win32com.client.Dispatch('Word.Application')和docx.Documents.Open()报错
- html下拉列表框做日期,几种常用的控件(下拉框 可选框 起止日期 在HTML页面直接读取当前时间)...
- python自动写作软件_火遍全网!3天学会Python自动化办公!
- 进销存软件单机两台或多台电脑能用吗
- xampp-windows-x64-7.3.3-0-VC15的安装与配置