schangxiang@126.com
2025-09-09 3d8966ba2c81e7e0365c8b123e861d18ee4f94f5
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
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
/**
 * APP端图片压缩
 *  参数说明:
 *  img 图片url
 *  scale缩放比例 1-100
 *  callback 回调设置返回值 
*/
export function translateapp(img, scale, callback) {
    // #ifdef APP-PLUS
        // uni.showLoading({
        //     title: '上传中...'
        // })
        plus.io.resolveLocalFileSystemURL(img, (entry) => { //通过URL参数获取目录对象或文件对象
            entry.file((file) => { // 可通过entry对象操作图片 
                console.log('压缩前图片信息:' + JSON.stringify(file)); //压缩前图片信息
                if (file.size > 500000) { //   如果大于500Kb进行压缩
                    plus.zip.compressImage({ // 5+ plus.zip.compressImage 了解一下,有详细的示例
                        src: img, //src: 压缩原始图片的路径    
                        dst: img.replace('.png', 'makino.png').replace('.PNG',
                                'makino.PNG').replace('.jpg', 'makino.jpg')
                            .replace('.JPG', 'makino.JPG'),
                        width: '80%', //dst: (String 类型 )压缩转换目标图片的路径,这里先在后面原始名后面加一个yasuo区分一下
                        height: '80%', //width,height: (String 类型 )缩放图片的宽度,高度
                        quality: 80, //quality: (Number 类型 )压缩图片的质量
                        overwrite: true, //overwrite: (Boolean 类型 )覆盖生成新文件
                        // format:'jpg'   //format: (String 类型 )压缩转换后的图片格式
                    }, (event) => {
                        console.log('压缩后图片信息:' + JSON.stringify(event)); 
                        uni.hideLoading();
                        //返回压缩后的图片路径
                        callback(event.target);
                    }, function(err) {
                         console.log('Resolve file URL failed: ' + err.message);
                         uni.hideLoading();
                    });
                } else { //else小于500kb跳过压缩,直接返回现有的src
                    callback(img);
                    
                }
            });
        }, (e) => { // 返回错误信息
             console.log('Resolve file URL failed: ' + e.message);
             uni.hideLoading();
        });
    // #endif
    // #ifndef APP-PLUS
        // translateImg(img, scale, 'blob' , callback)
        callback(img);
    // #endif
}
/**
* H5端图片压缩
*  参数说明:
*  imgSrc 图片url
*  scale缩放比例 0-1
*  type 返回图片类型  默认blob 
*  callback 回调设置返回值 
*/
export function translateImg(imgSrc, scale, type , callback) {
var img = new Image();
img.src = imgSrc;
img.onload = function() {
    var that = this;
    var h = that.height; // 默认按比例压缩
    var w = that.width;
    var canvas = document.createElement('canvas');
    var ctx = canvas.getContext('2d');
    var width = document.createAttribute("width");
    width.nodeValue = w;
    var height = document.createAttribute("height");
    height.nodeValue = h;
    canvas.setAttributeNode(width);
    canvas.setAttributeNode(height);
    ctx.drawImage(that, 0, 0, w,h);
    var base64 = canvas.toDataURL('image/jpeg', scale);//压缩比例
    canvas = null;
    if(type == 'base64'){
        callback(base64);
    }else{
        var blob = base64ToBlob(base64); 
        var blobUrl = window.URL.createObjectURL(blob);//blob地址
        callback(blobUrl);
    }
}
}
// base转Blob
export function base64ToBlob(base64) { 
var arr = base64.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 Blob([u8arr], {
    type: mime
});
}