<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
最近接到一個新的需求,需要將管理系統中指定頁面進行截圖並將截圖後的圖片動態新增文字之後儲存到本地指定目錄。本文按照測試demo簡單記錄一下,此需求分成三個需求點進行實現:
1.瀏覽器截圖生成圖片(儲存位置為伺服器指定目錄)
2.截圖後的圖片新增文字
3.伺服器圖片下載到使用者端本地指定目錄
phantomjs外掛官方下載地址:https://phantomjs.org/download.html
外掛組態檔目錄(windows環境使用phantomjs.exe,Linux使用phantomjs)
截圖測試demo:
檔案路徑獲取工具類:
@Component public class FileResourceUtil { @Autowired private ResourceLoader resourceLoader; /** * 根據檔案名字獲取路徑 * @param fileNameAndPath * @return */ public String getFilePath(String fileNameAndPath) throws IOException { File file = resourceLoader.getResource("file:"+ fileNameAndPath).getFile(); if(!file.exists()) { file = resourceLoader.getResource("classpath:"+ fileNameAndPath).getFile(); } return file.getAbsolutePath(); } }
截圖介面:
public interface ScreenshotService { String screenshot(HttpServletRequest re, String url, String size) throws IOException; }
截圖實現類:
@Service public class ScreenshotServiceImpl implements ScreenshotService { // 設定截圖後圖片儲存路徑 private String pdfPath = "D:/testPhoto/"; @Autowired private FileResourceUtil fileResourceUtil; @Override public String screenshot(HttpServletRequest re, String url, String size) throws IOException { String img = ""; // 此處可根據作業系統獲取對應phantomjs檔案路徑(phantomjs.exe對應Windows,phantomjs對應Linux) /* String plugin = ''; String os = System.getProperty("os.name").toLowerCase(); if (os.contains("windows")) { plugin = resourceUtil.getFilePath("plugin/phantomjs.exe"); }else{ plugin = resourceUtil.getFilePath("plugin/phantomjs"); }*/ // 測試環境為window環境,故獲取phantomjs.exe所在目錄 String plugin = fileResourceUtil.getFilePath("plugin/phantomjs.exe"); String js = fileResourceUtil.getFilePath("plugin/rasterize.js"); File file = new File(this.pdfPath); if (!file.exists()) { file.mkdirs(); } // 截圖後檔名可自定義 img = this.pdfPath + "1.png"; File pluginFile = new File(plugin); if (!pluginFile.canExecute()) { pluginFile.setExecutable(true); } File jsFile = new File(js); if (!execute(plugin, jsFile.getAbsolutePath(), url, img, size)) { return null; } return img; } // 截圖圖片流處理 public boolean execute(String... args) { Process process = null; StringBuilder msg = new StringBuilder(); try { process = Runtime.getRuntime().exec(args); BufferedReader input = new BufferedReader( new InputStreamReader(process.getInputStream())); String line; while ((line = input.readLine()) != null) { System.out.println(line); } input.close(); } catch (IOException e) { System.out.println("error:"+e.getCause()); msg.append("error"); } return !msg.toString().endsWith("error"); } }
測試:
@SpringBootTest class DemoApplicationTests { @Autowired public ScreenshotServiceImpl screenshotService; @Test public void test1(){ try { // 截圖圖片大小可根據實際需求進行設定 screenshotService.screenshot(null, "https://www.baidu.com/" , "800px*800px"); } catch (IOException e) { e.printStackTrace(); } }
截圖之後儲存圖片:
方法一:
public class DemoOne { public static void main(String[] args) { // 原檔案地址 String filePath = "D:\testPhoto\1.png"; // 儲存後檔案地址: String outPath = "D:\testPhoto\2.png"; drawTextInImg(filePath, "test", outPath, 60, 755, "black", 24.0f);//在圖片上加test } public static void drawTextInImg(String filePath, String text, String outPath,int left_n, int top_n,String color,float fsize) { ImageIcon imgIcon = new ImageIcon(filePath); Image img = imgIcon.getImage(); int width = img.getWidth(null); int height = img.getHeight(null); BufferedImage bimage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); Graphics2D g = bimage.createGraphics(); int fontSize = (int)fsize; //字型大小 int rectX = left_n; int rectY = top_n; Font font = new Font("宋體",Font.BOLD, fontSize); //定義字型 g.setBackground(Color.white); g.drawImage(img, 0, 0, null); if("black".equals(color)){ g.setPaint(Color.black); }else if("red".equals(color)){ g.setPaint(Color.red); } g.setFont(font); g.drawString(text, rectX, top_n); g.dispose(); try { FileOutputStream out = new FileOutputStream(outPath); ImageIO.write(bimage, "png", out); out.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }
簡單新增文字:
方法2:
public class DemoTwo { public void addWaterMark(String srcImgPath, String tarImgPath, String waterMarkContent,Color markContentColor,Font font) { try { // 讀取原圖片資訊 File srcImgFile = new File(srcImgPath);//得到檔案 Image srcImg = ImageIO.read(srcImgFile);//檔案轉化為圖片 int srcImgWidth = srcImg.getWidth(null);//獲取圖片的寬 int srcImgHeight = srcImg.getHeight(null);//獲取圖片的高 // 加水印 BufferedImage bufImg = new BufferedImage(srcImgWidth, srcImgHeight, BufferedImage.TYPE_INT_RGB); Graphics2D g = bufImg.createGraphics(); g.drawImage(srcImg, 0, 0, srcImgWidth, srcImgHeight, null); g.setColor(markContentColor); //根據圖片的背景設定水印顏色 g.setFont(font); //設定字型 //設定水印的座標 int x = srcImgWidth - 2*getWatermarkLength(waterMarkContent, g); int y = srcImgHeight - 2*getWatermarkLength(waterMarkContent, g); g.drawString(waterMarkContent, x, y); //畫出水印 g.dispose(); // 輸出圖片 FileOutputStream outImgStream = new FileOutputStream(tarImgPath); ImageIO.write(bufImg, "png", outImgStream); System.out.println("新增水印完成"); outImgStream.flush(); outImgStream.close(); } catch (Exception e) { // TODO: handle exception } } public int getWatermarkLength(String waterMarkContent, Graphics2D g) { return g.getFontMetrics(g.getFont()).charsWidth(waterMarkContent.toCharArray(), 0, waterMarkContent.length()); } public static void main(String[] args) { Font font = new Font("微軟雅黑", Font.PLAIN, 35); //水印字型 String srcImgPath="D:\testPhoto\1.png"; //源圖片地址 String tarImgPath="D:\testPhoto\3.png"; //待儲存的地址 String waterMarkContent="2022北京冬奧會"; //水印內容 Color color=new Color(135,206,235,128); //水印圖片色彩以及透明度 new WaterMarkUtils().addWaterMark(srcImgPath, tarImgPath, waterMarkContent,color,font); } }
新增之後圖片:
注意,這裡的下載選擇目錄是通過設定響應的contentType實現,並非通過前端標籤實現。下載目錄選擇頁面如下(檔名可動態設定):
測試demo:
@RestController public class DownLoad { @GetMapping("/down") public void down(HttpServletRequest request, HttpServletResponse response) throws IOException { // 圖片所在伺服器目錄 String filePath = "圖片所在伺服器目錄"; // 建立檔案物件 File file = new File(filePath); FileInputStream fileInputStream = new FileInputStream(file); //設定Http響應頭告訴瀏覽器下載圖片,下載的圖片名也是在這裡設定 response.setHeader("Content-Disposition", "attachment;Filename=自定義設定圖片名.png"); OutputStream outputStream = response.getOutputStream(); byte[] bytes = new byte[2048]; int len = 0; while ((len = fileInputStream.read(bytes))>0){ outputStream.write(bytes,0,len); } fileInputStream.close(); outputStream.close(); } }
到此這篇關於springboot實現瀏覽器截圖並新增文字的文章就介紹到這了,更多相關springboot瀏覽器截圖內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45