收藏
回答

小程序h5图片压缩问题(紧急求取,老板只给24小时,夺命call)

请教各位大神,本人有个项目在小程序中运行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);


跪谢各位大神,急急急!!!


回答关注问题邀请回答
收藏

26 个回答

  • 子夜
    子夜
    2018-10-24

    我站在案发现场,看到某程序员拿着粘血键盘,他一脸恐惧的看着倒在血泊中的老板。故事峰回路转。

    2018-10-24
    有用
    回复 12
    • Miranda''~🍧
      Miranda''~🍧
      2018-10-24

      兄弟,练过的吧?


      2018-10-24
      回复
    • 子夜
      子夜
      2018-10-24回复Miranda''~🍧

      先从腰开始吧

      2018-10-24
      回复
    • Miranda''~🍧
      Miranda''~🍧
      2018-10-24回复子夜

      清理现场

      2018-10-24
      回复
    • vv源vv
      vv源vv
      2018-10-24

      站在案发现场,我居然什么都没有发现!

      2018-10-24
      回复
    • 子夜
      子夜
      2018-10-24回复Miranda''~🍧

      爱过

      2018-10-24
      回复
    查看更多(7)
  • 阿白
    阿白
    2018-10-24

    压缩图片可以用canvas重绘来处理

    2018-10-24
    有用
    回复
  • 路漫星耀
    路漫星耀
    2018-10-24

    最快的解决方案,linux下有压缩jpg和png的插件,一个命令行,能压缩到40%体积。

    一劳永逸的方案,接一个luban,极限压缩10%。

    2018-10-24
    有用
    回复
  • vking
    vking
    2018-10-24

    这是之前写的客户端压缩demo https://myzingy.github.io/upload-img-resize/index.html,未在更多终端下做测试;


    https://github.com/myzingy/upload-img-resize      src 下有源码

    2018-10-24
    有用
    回复
  • 清烟
    清烟
    2018-10-24

    我之前也遇到了一个这样的问题,当时是用canvas重画图片来着

    2018-10-24
    有用
    回复
  • 龙荩草
    龙荩草
    2018-10-24

    一般处理这种,都是后台处理的,后台处理图片有专门的机制

    2018-10-24
    有用
    回复
  • 龙卷风
    龙卷风
    2018-10-24

    还有两个小时,楼主凉了吗?    去阴凉的位置躺好,避免过早发臭

    2018-10-24
    有用
    回复
  • libing
    libing
    2018-10-24

    把图片的尺寸改为%或vw,不要用rpx试试

    2018-10-24
    有用
    回复
  • 天道酬勤
    天道酬勤
    2018-10-24

    ... 重的东西全部交给服务器

    2018-10-24
    有用
    回复
  • 小茶
    小茶
    2018-10-24

    let data = canvas.toDataURL('image/jpeg'0.7);


    这个data你之后怎么用的?

    2018-10-24
    有用
    回复 1
    • kliwin
      kliwin
      2018-10-24

      上传到服务器,没有别的操作了

      2018-10-24
      回复

正在加载...

登录 后发表内容