如何以Java实现网页截图技术,根据URL得到网页快照

如何以Java实现网页截图技术,根据URL得到网页快照,第1张

可以用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次啊、等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/10139620.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-05
下一篇 2023-05-05

发表评论

登录后才能评论

评论列表(0条)

保存