可以用java 调用 wkhtmltopdf 软件进行网页截图,(Windows服务器 用这个中文显示会有问题) 另外用 html2canvasjs 这个插件可以做到网页内对某个元素的截图。 网上有好多例子
首先实现截图类GuiCamrajava
import javaawtDimension;import javaawtRectangle;
import javaawtRobot;
import javaawtToolkit;
import javaawtimageBufferedImage;
import javaioFile;
import javautilconcurrentatomicAtomicInteger;
import javaximageioImageIO;
public class GuiCamra {
private String fileName;
private String defaultName = "GuiCamera";
private AtomicInteger serialNum = new AtomicInteger(0);
private String imageFormat;
private String defaultImageFormat = "jpg";
Dimension d = ToolkitgetDefaultToolkit()getScreenSize();
private Rectangle r = new Rectangle(0, 0, (int)dgetWidth(), (int)dgetHeight());
public GuiCamra() {
fileName = defaultName;
imageFormat = defaultImageFormat;
}
public GuiCamra(String fileName,String imageFormat){
thisfileName = fileName;
thisimageFormat = imageFormat;
}
public void snapShot(){
try {
BufferedImage screenshot = new Robot()createScreenCapture(r);
String name = fileName + serialNumincrementAndGet() + "" + imageFormat;
File file = new File(name);
ImageIOwrite(screenshot, imageFormat, file);
} catch (Exception e) {
eprintStackTrace();
}
}
}
测试单线程的情况下,截图30张,大概需要3秒。
public class GuiCameraExample {public static void main(String[] args) {
long start = SystemcurrentTimeMillis();
GuiCamra cam = new GuiCamra("img","jpg");
for(int i = 0; i < 30; i++){
camsnapShot();
}
long total = SystemcurrentTimeMillis() - start;
Systemoutprintln("耗时:" + msToHms(total));
}
/
将一段时间的毫秒值转换成"时:分:秒"的形式HH:mm:ss
@param milliseconds 毫秒
@return String HH:mm:ss
/
public static String msToHms(long milliseconds){
try {
int hour = 0;
int minute = 0;
int second = 0;
second = (int)milliseconds / 1000;
if(second >= 60){
minute = second / 60;
second = second % 60;
}
if(minute >= 60){
hour = minute / 60;
minute = minute % 60;
}
if(hour != 0){
return Stringformat("%02d时%02d分%02d秒", hour,minute,second);
}
if(minute != 0){
return Stringformat("%02d分%02d秒", minute,second);
}
return Stringformat("%02d秒", second);
} catch (Exception e) {
return "";
}
}
}
这不满足条件,那么下面使用多线程来处理。
比如开5个线程,每个线程里截图6张。
GuiCamraTaskjava
public class GuiCamraTask implements Runnable {private GuiCamra guiCamra;
public GuiCamraTask(GuiCamra guiCamra){
thisguiCamra = guiCamra;
}
@Override
public void run() {
for(int i = 0; i < 6; i++){
guiCamrasnapShot();
}
}
}
主程序开启多个线程
public class GuiCameraExample {public static void main(String[] args) {
long start = SystemcurrentTimeMillis();
final int THREADS = 5;
GuiCamra cam = new GuiCamra("img","jpg");
GuiCamraTask[] tasks = new GuiCamraTask[THREADS];
Thread[] threads = new Thread[THREADS];
for(int i = 0; i < THREADS; i++){
tasks[i] = new GuiCamraTask(cam);
threads[i] = new Thread(tasks[i]);
threads[i]start();
}
for(int i = 0;i < THREADS; i++){
try {
threads[i]join(); //等待线程结束
} catch (InterruptedException e) {
eprintStackTrace();
}
}
long total = SystemcurrentTimeMillis() - start;
Systemoutprintln("耗时:" + msToHms(total));
}
/
将一段时间的毫秒值转换成"时:分:秒"的形式HH:mm:ss
@param milliseconds 毫秒
@return String HH:mm:ss
/
public static String msToHms(long milliseconds){
try {
int hour = 0;
int minute = 0;
int second = 0;
second = (int)milliseconds / 1000;
if(second >= 60){
minute = second / 60;
second = second % 60;
}
if(minute >= 60){
hour = minute / 60;
minute = minute % 60;
}
if(hour != 0){
return Stringformat("%02d时%02d分%02d秒", hour,minute,second);
}
if(minute != 0){
return Stringformat("%02d分%02d秒", minute,second);
}
return Stringformat("%02d秒", second);
} catch (Exception e) {
return "";
}
}
}
经过测试,1秒完成。当然,可能由于机器的配置不同,运行的时间或多或少。
如果在你的机器上1秒内不能完成,可以考虑继续增加线程数。
比如,开启6个线程,每个线程截图5张。
以上就是关于如何以Java实现网页截图技术,根据URL得到网页快照全部的内容,包括:如何以Java实现网页截图技术,根据URL得到网页快照、如何实现一秒截屏30次啊、等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)