ToB企服应用市场:ToB评测及商务社交产业平台

标题: 分享一个Chrome插件 滚动截屏功能 [打印本页]

作者: 乌市泽哥    时间: 2024-9-1 16:22
标题: 分享一个Chrome插件 滚动截屏功能
弁言

在当今信息时代,我们经常需要保存和分享网页内容。然而,传统的截图工具往往只能捕捉可见地区,无法完整保存长页面。本文将先容如何开发一个Chrome扩展来实现网页的滚动截图功能,让您轻松捕捉整个网页内容。
背景

在上周分享了chrome插件倒计时功能后,我在一次面试中发现预备的"八股文"知识没有用上。这促使我思考如何更好地分享有用的信息。虽然习惯利用微信的截屏功能,但它只能局部截屏或当前屏幕截屏,无法截取整个页面。因此,开发一个滚动截屏功能成为了我的下一个项目。
市场调研

首先,我浏览了Chrome应用商店,发现了一个名为Awesome Screenshot的应用。它提供了强大的截图和编辑功能,为我们的项目提供了很好的参考。

技术原理

在ChatGPT的帮忙下,我相识了滚动截屏的根本原理:
这个过程看似简单,但现实实现中遇到了不少挑战。

开发过程

项目搭建

我利用了之前的Plasmo框架快速搭建了一个简易版本的Chrome扩展。

重要挑战

开发过程中重要遇到以下困难:
核心代码实现

以下是一些关键代码片段:
  1. const tabs = await chrome.tabs.query({
  2.   active: true,
  3.   currentWindow: true
  4. })
  5. const tabId = tabs[0].id
  6. chrome.tabs.sendMessage(tabId, { action: "captureFullPage", tabId }, (response) => {
  7.   if (chrome.runtime.lastError || !response) {
  8.     console.log("Failed to get page info.")
  9.   } else {
  10.     console.log('captureFullPage cb: ', response)
  11.   }
  12. })
复制代码
  1. while (totalHeight < height) {
  2.   window.scrollTo(0, totalHeight)
  3.   if (totalHeight > 0) {
  4.     removeFixedAndStickyElements() // 移除固定和粘性元素
  5.   }
  6.   await sleep(600)
  7.   const { screenshotUrl } = await sendToBackground({
  8.     name: "capture",
  9.     body: {}
  10.   })
  11.   const compressedDataUrl = await compressImage(screenshotUrl, 0.6, 0.8)
  12.   screenShorts.push({
  13.     dataUrl: compressedDataUrl,
  14.     y: totalHeight
  15.   })
  16.   totalHeight += windowHeight
  17. }
复制代码
  1. const canvas = document.createElement("canvas")
  2. canvas.width = images[0].img.width
  3. canvas.height = totalHeightCanvas
  4. const ctx = canvas.getContext("2d")
  5. let currentY = 0
  6. images.forEach(({ img, y }, index) => {
  7.   const sourceY = index === images.length - 1 ? height - y : 0
  8.   const imgHeight = index === images.length - 1
  9.     ? img.height + (windowHeight - (height - y))
  10.     : img.height
  11.   const destY = currentY
  12.   currentY += imgHeight
  13.   ctx.drawImage(
  14.     img,
  15.     0,
  16.     sourceY,
  17.     img.width,
  18.     imgHeight,
  19.     0,
  20.     destY,
  21.     img.width,
  22.     imgHeight
  23.   )
  24. })
复制代码
遇到的题目和解决方案

  1. function removeFixedAndStickyElements() {
  2.   const fixedElements = [...document.querySelectorAll("*")].filter(
  3.     (el) =>
  4.       getComputedStyle(el).position === "fixed" ||
  5.       getComputedStyle(el).position === "sticky"
  6.   )
  7.   fixedElements.forEach((el) => {
  8.     hiddenElements.push({
  9.       element: el,
  10.       originalVisibility: el.style.visibility
  11.     })
  12.     el.style.visibility = "hidden"
  13.   })
  14. }
复制代码

已实现功能


待实现功能


经验总结

结论

开发这个滚动截图Chrome扩展是一次有趣而富有挑战性的履历。虽然还有改进空间,但它已经能够满足根本的长页面截图需求。我们期待在未来的版本中加入更多功能,提拔用户体验。
开源地址

接待访问项目源码并提供宝贵意见:
https://github.com/paulloo/chromePlugin_screenshot
感谢Awesome Screenshot为本项目提供了实现思路和界面参考。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4