最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java根據(jù)url生成圖片、截圖效果

 更新時(shí)間:2025年01月26日 11:41:12   作者:c740ab-9199-accf3bcc  
文章詳細(xì)介紹了如何使用Java和Node.js結(jié)合Puppeteer庫(kù)根據(jù)URL截圖,并將圖片轉(zhuǎn)換為標(biāo)準(zhǔn)輸出流返回給Java程序,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧

Java根據(jù)url截圖 說(shuō)明原理環(huán)境準(zhǔn)備如何使用集成

說(shuō)明

來(lái)都來(lái)了,別著急走,有些搞后端的同志看到使用了nodejs頭也不回的就走了,我也是純后端出身,接下來(lái)的內(nèi)容和安裝步驟我會(huì)以后端入門(mén)級(jí)開(kāi)發(fā)都能看懂方式描述,簡(jiǎn)易程度堪比Hello Word

原理

nodejs可以直接在cmd命令窗格中通過(guò)命令直接運(yùn)行,Java可以調(diào)用命令窗格執(zhí)行某個(gè)命令;

使用nodejs腳本調(diào)用Puppeteer(Puppeteer是一個(gè)由Google Chrome團(tuán)隊(duì)官方提供的Node.js庫(kù))利用Puppeteer無(wú)感的調(diào)用Chrome瀏覽器抓取網(wǎng)頁(yè)并截圖,最后將圖片轉(zhuǎn)為標(biāo)準(zhǔn)輸出流返給Java程序

環(huán)境準(zhǔn)備

1.確保已經(jīng)安裝了node和npm運(yùn)行環(huán)境

node -v
npm -v

可以執(zhí)行上面的兩個(gè)命令來(lái)檢查,能看到輸出版本號(hào),表示環(huán)境沒(méi)問(wèn)題;如果沒(méi)有安裝可以訪問(wèn)nodejs官網(wǎng),下載安裝程序 傻瓜式下一步安裝即可;安裝完成后將鏡像地址改成國(guó)內(nèi)的

npm config set registry https://registry.npmmirror.com

2.確保安裝了Chrome瀏覽器或基于Chrome內(nèi)核開(kāi)發(fā)的瀏覽器

如何使用

1.創(chuàng)建文件夾,打開(kāi)cmd cd到新建的文件中執(zhí)行下面的命令,這個(gè)過(guò)程大概需要3-5分鐘

npm install puppeteer

執(zhí)行完后的效果如下

2.新建screenshot.js文件,編寫(xiě)nodejs腳本

const puppeteer = require('puppeteer');
// 獲取java傳過(guò)來(lái)的參數(shù)
const url = process.argv[2];
(async () => {
    const browser = await puppeteer.launch();
    const page = await browser.newPage();
    // 設(shè)置視口大小
    await page.setViewport({
        width: 1920,
        height: 1080,
        deviceScaleFactor: 2, // 像素比,默認(rèn)為 1。在高 DPI 屏幕上,可以將其設(shè)置為 2 或更高,以模擬高分辨率顯示。
    });
    await page.goto(url);
    const screenshotBuffer = await page.screenshot({
        fullPage: true;//是否截全屏
    });
    // 輸出截圖的 Buffer 到標(biāo)準(zhǔn)輸出流
    process.stdout.write(screenshotBuffer);
    await browser.close();
})();

效果如下

3.cmd在當(dāng)前目錄中執(zhí)行下面的命令,測(cè)試抓取百度的頁(yè)面

node screenshot.js https://www.baidu.com/

抓取成功后的效果
一堆亂碼對(duì)吧,但是不要慌 這是正常的,因?yàn)槟_本中是將文件流轉(zhuǎn)成了標(biāo)準(zhǔn)的輸出流

4.Java代碼

package com.assoft.erms.common.utils;
import java.io.ByteArrayOutputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
public class ScreenshotUtil {
    public static void main(String[] args) {
        //js腳本文件地址
        String screenshotJs = "D:\\workspace\\javascript\\screenshot.js";
        //要截圖的網(wǎng)頁(yè)(有攔截器,需要驗(yàn)證身份的不行)
        String url = "http://politics.people.com.cn/n1/2024/1031/c1024-40350705.html";
        //保存的文件名
        String filePath = "screenshot.png";
        try {
            //兩種返回類(lèi)型,邏輯是一樣的;只是返回類(lèi)型不同 根據(jù)情況自行選擇
            // 模式一:獲取截圖的字節(jié)數(shù)組
            byte[] screenshotBytes = ScreenshotUtil.captureScreenshotAsBytes(url,screenshotJs);
            System.out.println("屏幕截圖字節(jié)數(shù)組長(zhǎng)度: " + screenshotBytes.length);
            // 模式二:將截圖保存到指定路徑
            ScreenshotUtil.captureScreenshotAsFile(url, filePath,screenshotJs);
            System.out.println("屏幕截圖已保存到: " + filePath);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    /**
     * 獲取網(wǎng)頁(yè)截圖的字節(jié)數(shù)組
     * @param url
     * @return
     * @throws Exception
     */
    public static byte[] captureScreenshotAsBytes(String url,String screenshotJs) throws Exception {
        Process process = Runtime.getRuntime().exec(new String[]{"node", screenshotJs, url});
        // 獲取 Process 的輸入流
        try (InputStream inputStream = process.getInputStream();
             ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream()) {
            byte[] buffer = new byte[1024];
            int length;
            while ((length = inputStream.read(buffer)) != -1) {
                byteArrayOutputStream.write(buffer, 0, length);
            }
            process.waitFor(); // 等待進(jìn)程結(jié)束
            return byteArrayOutputStream.toByteArray(); // 返回字節(jié)數(shù)組
        }
    }
    /**
     * 將網(wǎng)頁(yè)截圖保存到指定路徑
     * @param url
     * @param filePath
     * @throws Exception
     */
    public static void captureScreenshotAsFile(String url, String filePath,String screenshotJs) throws Exception {
        byte[] screenshotBytes = captureScreenshotAsBytes(url,screenshotJs); // 獲取截圖字節(jié)數(shù)組
        // 將字節(jié)數(shù)組寫(xiě)入文件
        try (FileOutputStream fileOutputStream = new FileOutputStream(filePath)) {
            fileOutputStream.write(screenshotBytes);
        }
    }
}

5.最終的效果圖如下

圖片違規(guī)了。。。。

集成

Demo是寫(xiě)好了,怎么集成到自己的java工程中呢?

很簡(jiǎn)單只需要將node_modules和screenshot.js復(fù)制到自己的Java工程中,package.json、package-lock.json不需要

目錄層級(jí)的說(shuō)明:
screenshot.js會(huì)往上查找node_modules,以下是三個(gè)例子

可行

|-- node_modules
|-- screenshot.js

可行

|-- node_modules
|-- js
	|-- screenshot.js

不可行

|-- screenshot.js
|-- static
	|-- node_modules

到此這篇關(guān)于Java根據(jù)url生成圖片、截圖的文章就介紹到這了,更多相關(guān)java根據(jù)url生成圖片內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 詳解java中BigDecimal精度問(wèn)題

    詳解java中BigDecimal精度問(wèn)題

    這篇文章主要介紹了java BigDecimal精度問(wèn)題,對(duì)精確計(jì)算感興趣的同學(xué),可以參考下
    2021-05-05
  • Idea 搭建Spring源碼環(huán)境的超詳細(xì)教程

    Idea 搭建Spring源碼環(huán)境的超詳細(xì)教程

    這篇文章主要介紹了Idea 搭建Spring源碼環(huán)境,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-10-10
  • Java源碼難點(diǎn)突破Lambda表達(dá)式執(zhí)行原理

    Java源碼難點(diǎn)突破Lambda表達(dá)式執(zhí)行原理

    這篇文章主要為大家介紹了Java難點(diǎn)突破Lambda表達(dá)式執(zhí)行原理分析及示例的實(shí)現(xiàn)源碼,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步
    2022-03-03
  • SpringBoot中請(qǐng)求入?yún)㈩?lèi)型轉(zhuǎn)換的6種玩法

    SpringBoot中請(qǐng)求入?yún)㈩?lèi)型轉(zhuǎn)換的6種玩法

    做 Spring Boot Web 開(kāi)發(fā)的小伙伴,想必都做過(guò)請(qǐng)求入?yún)㈩?lèi)型轉(zhuǎn)換吧,本文將和大家詳細(xì)介紹一下SpringBoot參數(shù)類(lèi)型轉(zhuǎn)換的6種玩法,希望對(duì)大家有所幫助
    2026-02-02
  • 詳解Spring配置事務(wù)的五種方式

    詳解Spring配置事務(wù)的五種方式

    這篇文章主要為大家詳細(xì)介紹了Spring配置事務(wù)的五種方式,感興趣的小伙伴們可以參考一下
    2016-06-06
  • Java加密解密工具(適用于JavaSE/JavaEE/Android)

    Java加密解密工具(適用于JavaSE/JavaEE/Android)

    這篇文章主要介紹了Java加密解密工具,適用于JavaSE/JavaEE/Android,感興趣的小伙伴們可以參考一下
    2016-04-04
  • Mybatis常見(jiàn)注解有哪些(總結(jié))

    Mybatis常見(jiàn)注解有哪些(總結(jié))

    這篇文章主要介紹了Mybatis常見(jiàn)注解有哪些(總結(jié)),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • struts2實(shí)現(xiàn)多文件上傳

    struts2實(shí)現(xiàn)多文件上傳

    這篇文章主要為大家詳細(xì)介紹了struts2實(shí)現(xiàn)多文件上傳,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-08-08
  • Java中IO流解析及代碼實(shí)例詳解

    Java中IO流解析及代碼實(shí)例詳解

    流是一種抽象概念,它代表了數(shù)據(jù)的無(wú)結(jié)構(gòu)化傳遞。。用來(lái)進(jìn)行輸入輸出操作的流就稱(chēng)為IO流。換句話說(shuō),IO流就是以流的方式進(jìn)行輸入輸出
    2021-08-08
  • SpringBoot中通過(guò)AOP整合日志文件的實(shí)現(xiàn)

    SpringBoot中通過(guò)AOP整合日志文件的實(shí)現(xiàn)

    本文主要介紹了SpringBoot中通過(guò)AOP整合日志文件的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-12-12

最新評(píng)論

光泽县| 德兴市| 庆城县| 牙克石市| 东乡族自治县| 洪江市| 商洛市| 五大连池市| 福海县| 成武县| 纳雍县| 鹤山市| 仁寿县| 衡山县| 五华县| 衡水市| 孟州市| 民勤县| 曲靖市| 广灵县| 昔阳县| 渭南市| 佳木斯市| 台湾省| 嘉荫县| 霞浦县| 平塘县| 宜宾市| 申扎县| 台东市| 乌苏市| 莫力| 祁连县| 博爱县| 长泰县| 霍山县| 建宁县| 舟曲县| 徐州市| 曲阳县| 含山县|