请教各位大神,本人有个项目在小程序中运行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 处理一个 1000*1000 的图片基本就会崩溃了,小程序里面 web-view 打开 H5 页面做 Canvas 处理应该也差不多吧
oppo手机拍出来六千多万像素的照片是能成功压缩的
canvas 的区域如果你的算法没有问题应该是不会出现一半是好的 一半是错的 应该是你截取的 区域有问题把?
目前可以确定的是oppo手机的超清画质的图片会有一半好一半坏的问题
这个不能交给后台处理了,然后返回给h5.
可以,不过现在改来不及
借楼问下申请小程序最后一步怎么付款那个0.87元
这个要问客服
楼主有结果了吗?我也遇到同样的问题,在线等,急!!!!
坐等社区大神解答,尝遍了奇技淫巧