html2canvas截取不到openlayer地图(底图和注记等切片服务图层)解决方案

第一步:设置所有切片图层服务的source对象,添加属性 crossOrigin: "anonymous",   //允许跨域

 

 

 第二步:设置html2canvas配置项:

 

 

 

最后,附上html2canvas相关方法代码

// 调用
let mapImg = await this.toImage('map', this.uuid());
// 方法体
// 开始截图
            toImage(elementId, imgName) {
                //console.log(elementId)
                // 手动创建一个 canvas 标签
                const canvas = document.createElement('canvas');
                // 获取父标签,意思是这个标签内的 DOM 元素生成图片
                // lessonTableImg是给截图范围内的父级元素自定义的ref名称
                const canvasBox = document.getElementById(elementId);
                // 获取父级的宽高
                const width = parseInt(window.getComputedStyle(canvasBox).width);
                const height = parseInt(window.getComputedStyle(canvasBox).height);
                // 宽高 * 1 并放大 1 倍 是为了防止图片模糊
                canvas.width = width * 1;
                canvas.height = height * 1;
                canvas.style.width = width + 'px';
                canvas.style.height = height + 'px';
                const context = canvas.getContext('2d');
                context.scale(1, 1);
                const options = {
                    backgroundColor: '#061b48', // 设置canvas背景图颜色 防止有些图片透明
                    canvas: canvas,
                    useCORS: true,
                };
                return html2canvas(canvasBox, options).then(async (canvas) => {
                    // toDataURL 图片格式转成 base64
                    const dataURL = canvas.toDataURL('image/png');
                    // 调用下载
                    // this.downloadImage(dataURL);
                    // 转为file文件
                    const file = this.dataURLtoFile(dataURL, imgName);
                    return file;
                });
            },
            // 下载图片 传入base64
            downloadImage(url) {
                // 如果是在网页中可以直接创建一个 a 标签直接下载
                const a = document.createElement('a');
                a.href = url;
                a.download = '首页截图';
                a.click();
            },
            // base64转file方法
            dataURLtoFile: function (dataurl, filename) {
                const arr = dataurl.split(',')
                const mime = arr[0].match(/:(.*?);/)[1]
                const bstr = atob(arr[1])
                let n = bstr.length
                const u8arr = new Uint8Array(n)
                while (n--) {
                    u8arr[n] = bstr.charCodeAt(n);
                }
                return new File([u8arr], filename + '.png', { type: mime });
            },
            // 获取uuid
            uuid() {
                const s = [];
                const hexDigits = '0123456789abcdef';
                for (let i = 0; i < 36; i++) {
                    s[i] = hexDigits.substr(Math.floor(Math.random() * 0x10), 1);
                }
                s[14] = '4'; // bits 12-15 of the time_hi_and_version field to 0010
                s[19] = hexDigits.substr((s[19] & 0x3) | 0x8, 1); // bits 6-7 of the clock_seq_hi_and_reserved to 01
                s[8] = s[13] = s[18] = s[23] = '-';

                const uuid = s.join('');
                return uuid;
            }

 

posted @ 2023-02-22 15:19  一两米  阅读(430)  评论(0编辑  收藏  举报