欢迎光临
我们一直在努力

直播源码网站,js处理图片变形、方向、压缩等

直播源码网站,js处理图片变形、方向、压缩等实现的相关代码

 

//检查图片是否有被压扁,如果有,返回比率
//http://stackoverflow.com/questions/11929099/html5-canvas-drawimage-ratio-bug-ios
function detectVerticalSquash(img) {
  // 拍照在IOS7或以下的机型会出现照片被压扁的bug
  var data;
  var ih = img.naturalHeight;
  var canvas = document.createElement('canvas');
  canvas.width = 1;
  canvas.height = ih;
  var ctx = canvas.getContext('2d');
  ctx.drawImage(img, 0, 0);
  try {
    data = ctx.getImageData(0, 0, 1, ih).data;
  } catch (err) {
    console.log('Cannot check verticalSquash: CORS?');
    return 1;
  }
  var sy = 0;
  var ey = ih;
  var py = ih;
  while (py > sy) {
    var alpha = data[(py - 1) * 4 + 3];
    if (alpha === 0) {
      ey = py;
    } else {
      sy = py;
    }
    py = (ey + sy) >> 1; // py = parseInt((ey + sy) / 2)
  }
  var ratio = py / ih;
  return ratio === 0 ? 1 : ratio;
}
//https://gist.github.com/fupslot/5015897
function dataURItoBuffer(dataURI) {
  var byteString = atob(dataURI.split(',')[1]);
  var buffer = new ArrayBuffer(byteString.length);
  var view = new Uint8Array(buffer);
  for (var i = 0; i < byteString.length; i++) {
    view[i] = byteString.charCodeAt(i);
  }
  return buffer;
}
function dataURItoBlob(dataURI) {
  var mimeString = dataURI.split(',')[0].split(':')[1].split(';')[0];
  var buffer = dataURItoBuffer(dataURI);
  return new Blob([buffer], { type: mimeString });
}
//获取图片的orientation
//http://stackoverflow.com/questions/7584794/accessing-jpeg-exif-rotation-data-in-javascript-on-the-client-side
function getOrientation(buffer) {
  var view = new DataView(buffer);
  if (view.getUint16(0, false) != 0xffd8) return -2;
  var length = view.byteLength,
    offset = 2;
  while (offset < length) {
    var marker = view.getUint16(offset, false);
    offset += 2;
    if (marker == 0xffe1) {
      if (view.getUint32((offset += 2), false) != 0x45786966) return -1;
      var little = view.getUint16((offset += 6), false) == 0x4949;
      offset += view.getUint32(offset + 4, little);
      var tags = view.getUint16(offset, little);
      offset += 2;
      for (var i = 0; i < tags; i++)
        if (view.getUint16(offset + i * 12, little) == 0x0112)
          return view.getUint16(offset + i * 12 + 8, little);
    } else if ((marker & 0xff00) != 0xff00) break;
    else offset += view.getUint16(offset, false);
  }
  return -1;
}
 //修正拍照时图片的方向
 //http://stackoverflow.com/questions/19463126/how-to-draw-photo-with-correct-orientation-in-canvas-after-capture-photo-by-usin
function orientationHelper(canvas, ctx, orientation) {
  const w = canvas.width,
    h = canvas.height;
  if (orientation > 4) {
    canvas.width = h;
    canvas.height = w;
  }
  switch (orientation) {
    case 2:
      ctx.translate(w, 0);
      ctx.scale(-1, 1);
      break;
    case 3:
      ctx.translate(w, h);
      ctx.rotate(Math.PI);
      break;
    case 4:
      ctx.translate(0, h);
      ctx.scale(1, -1);
      break;
    case 5:
      ctx.rotate(0.5 * Math.PI);
      ctx.scale(1, -1);
      break;
    case 6:
      ctx.rotate(0.5 * Math.PI);
      ctx.translate(0, -h);
      break;
    case 7:
      ctx.rotate(0.5 * Math.PI);
      ctx.translate(w, -h);
      ctx.scale(-1, 1);
      break;
    case 8:
      ctx.rotate(-0.5 * Math.PI);
      ctx.translate(-w, 0);
      break;
  }
}
// canvas 压缩图片
export function compress(file, options, callback) {
  const reader = new FileReader();
  reader.onload = function (evt) {
    if (options.compress === false) {
      // 不启用压缩 & base64上传 的分支,不做任何处理,直接返回文件的base64编码
      file.base64 = evt.target.result;
      callback(file);
      return;
    }
    // 启用压缩的分支
    const img = new Image();
    img.onload = function () {
      const ratio = detectVerticalSquash(img);
      const orientation = getOrientation(dataURItoBuffer(img.src));
      const canvas = document.createElement('canvas');
      const ctx = canvas.getContext('2d');
      const maxW = options.compress.width;
      const maxH = options.compress.height;
      let w = img.width;
      let h = img.height;
      let dataURL;
      if (w < h && h > maxH) {
        w = parseInt((maxH * img.width) / img.height);
        h = maxH;
      } else if (w >= h && w > maxW) {
        h = parseInt((maxW * img.height) / img.width);
        w = maxW;
      }
      canvas.width = w;
      canvas.height = h;
      if (orientation > 0) {
        orientationHelper(canvas, ctx, orientation);
      }
      ctx.drawImage(img, 0, 0, w, h / ratio);
      if (/image\/jpeg/.test(file.type) || /image\/jpg/.test(file.type)) {
        dataURL = canvas.toDataURL('image/jpeg', options.compress.quality);
      } else {
        dataURL = canvas.toDataURL(file.type);
      }
      if (options.type == 'file') {
        if (/;base64,null/.test(dataURL) || /;base64,$/.test(dataURL)) {
          // 压缩出错,以文件方式上传的,采用原文件上传
          console.warn(
            'Compress fail, dataURL is ' +
              dataURL +
              '. Next will use origin file to upload.'
          );
          callback(file);
        } else {
          let blob = dataURItoBlob(dataURL);
          blob.id = file.id;
          blob.name = file.name;
          blob.lastModified = file.lastModified;
          blob.lastModifiedDate = file.lastModifiedDate;
          callback(blob);
        }
      } else {
        if (/;base64,null/.test(dataURL) || /;base64,$/.test(dataURL)) {
          // 压缩失败,以base64上传的,直接报错不上传
          options.onError(
            file,
            new Error('Compress fail, dataURL is ' + dataURL + '.')
          );
          callback();
        } else {
          file.base64 = dataURL;
          callback(file);
        }
      }
    };
    img.src = evt.target.result;
  };
  reader.readAsDataURL(file);
}
// 补全图片base64头部
export function completePictureBase64(suffix,file) {
  if(suffix === 'png') {
    return 'data:image/png;base64,' + file
  }else {
    return 'data:image/jpeg;base64,' + file
  }
}

以上就是 直播源码网站,js处理图片变形、方向、压缩等实现的相关代码,更多内容欢迎关注之后的文章

 

  • 海报
海报图正在生成中...
赞(0) 打赏
声明:
1、本博客不从事任何主机及服务器租赁业务,不参与任何交易,也绝非中介。博客内容仅记录博主个人感兴趣的服务器测评结果及一些服务器相关的优惠活动,信息均摘自网络或来自服务商主动提供;所以对本博客提及的内容不作直接、间接、法定、约定的保证,博客内容也不具备任何参考价值及引导作用,访问者需自行甄别。
2、访问本博客请务必遵守有关互联网的相关法律、规定与规则;不能利用本博客所提及的内容从事任何违法、违规操作;否则造成的一切后果由访问者自行承担。
3、未成年人及不能独立承担法律责任的个人及群体请勿访问本博客。
4、一旦您访问本博客,即表示您已经知晓并接受了以上声明通告。
文章名称:《直播源码网站,js处理图片变形、方向、压缩等》
文章链接:https://www.456zj.com/9439.html
本站资源仅供个人学习交流,请于下载后24小时内删除,不允许用于商业用途,否则法律问题自行承担。

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址