截屏,并传递到后台

简化版

<div ref='box'></div>
cnpm i html2canvas --save

//引入html2canvas
import html2canvas from 'html2canvas'



screenshot(){
html2canvas(this.$refs.box,{
backgroundColor:null,//避免图片有白色边框
useCORS:true,
allowTaint:true
}).then(canvas=>{
let dataURL = canvas.toDataURL('image/png',1.0)
//默认截取的图片就是base64格式的,后台可以转化
this.$emit('search',dataURL)
})
}

详细版

async screenshot(){
let base64ImgStr = '';
try{
let htmlDOM = this.$refs.box;
const domWidth = htmlDOM.offsetWidth;
const domHeight = htmlDOM.offsetHeight;
const scale = widow.devicePixelRatio ? window.devicePixeRatio:2;
const canvas = document.createElement('canvas')
canvas.width = domWidth * scale;
canvas.height = domHeight * scale;
canvas.style.width = `{domWidth}px`;
canvas.style.height = `{domHeight}px`;

const ctx = canvas.getContext('2d')
ctx.scale(scale,scale);

window.pageYoffset = 0;
document.documentElement.scrollTop = 0;
document.body.scrollTop = 0;

const DOMCanvas = await html2canvas(htmlDOM,{
canvas,
backgroundColor:'rgba(0,0,0,0)';
width:domWidth,
height:domHeight,
useCORS:true,
allowTaint:false,
scrollX:0,
scrollY:0,
logging:true//日志打印
})
base64ImgStr = DOMCanvas.toDataURL('image/png')
//根据情况看,是否去掉base64的前缀
base64ImgStr = base64ImgStr.replace(/^data:image\/w+;base64,/,'')
if(base64ImgStr){
console.log('success')
//默认截取的图片就是base64格式的,后台可以转化
this.$emit('search',dataURL)
}else{
console.log('error')
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我会根据您的要求来回答问题。 以下是一个使用Python、Channels 4.0、Websocket、pyautogui、numpy、Uint8Array编写的截图并压缩图片传递前端的例子: 首先,在Python中安装必要的库: ``` pip install channels numpy pyautogui Pillow ``` 在django项目根目录创建一个名为 `consumers.py` 的文件,并添加以下内容: ```python import asyncio import pyautogui import numpy as np from PIL import Image from channels.generic.websocket import AsyncWebsocketConsumer class ScreenshotConsumer(AsyncWebsocketConsumer): async def connect(self): self.accept() async def disconnect(self, close_code): pass async def receive(self, text_data): if text_data == 'screenshot': await self.send(text_data='prepare') await asyncio.sleep(1) img = pyautogui.screenshot() img = np.array(img) img = Image.fromarray(img) img.save('screenshot.png', format='PNG', optimize=True) with open('screenshot.png', 'rb') as f: data = f.read() await self.send(text_data=data) ``` 接下来,在 `routing.py` 文件中添加以下内容: ```python from django.urls import re_path from . import consumers websocket_urlpatterns = [ re_path(r'ws/screenshot/$', consumers.ScreenshotConsumer.as_asgi()), ] ``` 最后,在前端使用JavaScript连接到WebSocket,并发送触发截图的消息: ```javascript const socket = new WebSocket('ws://localhost:8000/ws/screenshot/'); socket.onmessage = function(event) { const data = event.data; if (data === 'prepare') { console.log('Preparing screenshot'); } else { const bytes = new Uint8Array(data); const blob = new Blob([bytes], {type: 'image/png'}); const url = URL.createObjectURL(blob); const img = document.createElement('img'); img.src = url; document.body.appendChild(img); URL.revokeObjectURL(url); } }; socket.onopen = function() { socket.send('screenshot'); }; ``` 当WebSocket连接建立后,前端发送 `screenshot` 消息,后台接收到消息后会发送 `prepare` 消息,前端收到 `prepare` 消息后可以进行一些准备工作(例如显示一个加载中的动画),然后等待后台发送图片数据。后台发送图片数据后,前端将其转换为Blob对象,然后再创建一个URL来加载图片。 至此,您就可以使用Python、Channels 4.0、Websocket、pyautogui、numpy、Uint8Array来实现截图并压缩图片传递前端了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值