riku
2025-07-15 c40f4c1267dae4fcf27dbbd75ea83014fba87783
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
export default {
    getBase64(url, callback) {
        //通过构造函数来创建的 img 实例,在赋予 src 值后就会立刻下载图片,相比 createElement() 创建 <img> 省去了 append(),也就避免了文档冗余和污染
        var Img = new Image(),
            dataURL = '';
        Img.setAttribute('crossOrigin', 'Anonymous'); // 解决控制台跨域报错的问题
        
        if (url.startsWith("blob")) {
            Img.src = url;
        }else {
            Img.src = url + '?v=' + Math.random(); // 处理缓存,fix缓存bug,有缓存,浏览器会报错;
            // Img.src = url;
        }
        // Img.src = /^data:image/.test(url) ? url : url + '?' + new Date().getTime() + '&v=' + Math.random(); // 处理缓存,fix缓存bug,有缓存,浏览器会报错;
 
        // Img.crossOrigin = "*"; // 解决控制台跨域报错的问题
        Img.onload = function () {
            //要先确保图片完整获取到,这是个异步事件
            var canvas = document.createElement('canvas'), //创建canvas元素
                width = Img.width, //确保canvas的尺寸和图片一样
                height = Img.height;
            canvas.width = width;
            canvas.height = height;
            canvas.setAttribute('crossOrigin', 'Anonymous'); // 解决控制台跨域报错的问题
            canvas.getContext('2d').drawImage(Img, 0, 0, width, height); //将图片绘制到canvas中
            dataURL = canvas.toDataURL('image/jpeg'); //转换图片为dataURL
            callback ? callback(dataURL) : null; //调用回调函数
        };
    },
    getImageFiles(urls, callback) {
        if (urls.length == 0) {
            callback([])
        }
        var files = [];
        urls.forEach((url) => {
            this.setInitImg(url, (file) => {
                files.push(file);
                if (files.length == urls.length) {
                    callback(files);
                }
            });
        });
    },
    setInitImg(url, callback) {
        let img = url;
        let _ = this;
        let imgRes;
        this.getBase64(img, (dataURL) => {
            imgRes = this.dataURLtoFile(dataURL, img);
            console.log(imgRes);
            callback(imgRes);
        });
    },
    dataURLtoFile(dataurl, filename) {
        //将base64转换为文件,dataurl为base64字符串,filename为文件名(必须带后缀名,如.jpg,.png)
        var arr = dataurl.split(','),
          mime = arr[0].match(/:(.*?);/)[1],
          bstr = atob(arr[1]),
          n = bstr.length,
          u8arr = new Uint8Array(n);
        while (n--) {
          u8arr[n] = bstr.charCodeAt(n);
        }
        return new File([u8arr], filename, { type: mime });
      }
}