请教各位大神,本人有个项目在小程序中运行h5页面,需要使用h5进行图片压缩,目前大量用户遇到了安卓上压缩后的图片是黑图(设置底色为白色),ios上传的是白图,部分oppo手机的图片为上半张图正常,下半张图类似绿色蒙层,源码如下:
let canvas = document.createElement("canvas");
let ctx = canvas.getContext('2d');
let initSize = img.src.length;
let width = img.width;
let height = img.height;
//如果图片大于四百万像素,计算压缩比并将大小压至400万以下
let ratio;
if ((ratio = width * height / 4000000) > 1) {
ratio = Math.sqrt(ratio);
width /= ratio;
height /= ratio;
} else {
ratio = 1;
}
canvas.width = width;
canvas.height = height;
// 铺底色
ctx.fillStyle = "#fff";
ctx.fillRect(0, 0, canvas.width, canvas.height);
//如果图片像素大于100万则使用瓦片绘制
let count;
if ((count = width * height / 1000000) > 1 && Util.isIOS()) {
count = Math.ceil(Math.sqrt(count)); //计算要分成多少块瓦片
// 计算每块瓦片的宽和高
var nw = ~~(width / count);
var nh = ~~(height / count);
// 瓦片canvas
for (var i = 0; i < count; i++) {
for (var j = 0; j < count; j++) {
let tCanvas = document.createElement("canvas");
let tCtx = tCanvas.getContext("2d");
tCanvas.width = nw;
tCanvas.height = nh;
tCtx.drawImage(img, Math.ceil(i * nw * ratio), Math.ceil(j * nh * ratio), Math.ceil(nw * ratio), Math.ceil(nh * ratio), 0, 0, nw, nh);
ctx.drawImage(tCanvas, i * nw, j * nh, nw, nh);
}
}
} else {
ctx.drawImage(img, 0, 0, width, height);
}
let data = canvas.toDataURL('image/jpeg', 0.7);
跪谢各位大神,急急急!!!
我站在案发现场,看到某程序员拿着粘血键盘,他一脸恐惧的看着倒在血泊中的老板。故事峰回路转。
兄弟,练过的吧?
先从腰开始吧
清理现场
站在案发现场,我居然什么都没有发现!
爱过
压缩图片可以用canvas重绘来处理
最快的解决方案,linux下有压缩jpg和png的插件,一个命令行,能压缩到40%体积。
一劳永逸的方案,接一个luban,极限压缩10%。
这是之前写的客户端压缩demo https://myzingy.github.io/upload-img-resize/index.html,未在更多终端下做测试;
https://github.com/myzingy/upload-img-resize src 下有源码
我之前也遇到了一个这样的问题,当时是用canvas重画图片来着
一般处理这种,都是后台处理的,后台处理图片有专门的机制
还有两个小时,楼主凉了吗? 去阴凉的位置躺好,避免过早发臭
把图片的尺寸改为%或vw,不要用rpx试试
... 重的东西全部交给服务器
let data = canvas.toDataURL('image/jpeg', 0.7);
这个data你之后怎么用的?
上传到服务器,没有别的操作了