js读取jpg图片扩展信息,处理二进制数据

3 篇文章 0 订阅

js 读取图片扩展信息

将图片转为ArrayBuffer

  var http = new XMLHttpRequest();
  http.onload = function() {
      if (this.status == 200 || this.status === 0) {
          // console.log(http.response)
          let arrbuffer = http.response;
      }
      http = null;
  };
  http.open("GET", img.src, true);
  http.responseType = "arraybuffer";
  http.send(null);
  ps: responseType为blob也可以,将返回的blob用fileReader转为ArrayBuffer

截取ArrayBuffer,获取扩展信息起始位置和结束位置

  // 根据标识信息获取索引
  function findIPTCinJPEG(arrBuffer)) {
    // arrayBuffer 是二进制数据,不能够直接读取,需要借助dataView接口进行处理
    var dataView = new DataView(arrBuffer);
    var offset = 0,
        length = arrBuffer.byteLength;
    // 标识位信息是FFE1,为16进制
    var isFieldSegmentStart = function(dataView, offset){
        return dataView.getUint16(offset) === 0xFFE1;
    };
    while (offset < length) {
        if (isFieldSegmentStart(dataView, offset)){
            break;
        }
        offset++;
    }
    return offset
  }
  let i = findIPTCinJPEG(arrbuffer);
  /**
   * 第一个2表示 FF E1 2字节
   * 第二个2表示 00 00 2字节
   */
  let start = i + 2 + 2;
  /**
   * 第一个8表示公司名称,8字节
   * 第二个4空 4字节
   * 第三个16表示泊位号 16字节
   * 第四个16表示车牌号 16字节
   */
  let end = start + 8 + 4 + 16 + 16;
  let sliceBuffer = arrbuffer.slice(start, end);

根据编码格式解析ArrayBuffer

  // 利用fileReader读取二进制数据,解析为文本
  function ab2str(u, fn) {
    var b = new Blob([u]);
    var r = new FileReader();
    r.readAsText(b, 'utf-8');
    r.onload = function (){
      let content = r.result;
      // ai    1234567890   京A12345
      let arr = content.split('\x00\x00\x00\x00\x00\x00')
      fn(arr);
    }
  }

将解析后的信息,给图片打水印

  <img :src="picSrc"  style="width: 600px;height: 400px"/>
  // ArrayBuffer转blob
  let blob = new Blob([arrbuffer], {type: "image/jpeg"});
  // blob转文件
  let picSrc = window.URL.createObjectURL(blob);
  let image = new Image();
  image.crossOrigin = 'anonymous';
  image.src = picSrc;
  image.onload = function() {
    // 获取图片真实宽高
    const w = image.width;
    const h = image.height;
    // 创建canvas绘制原图
    let originCanvas = document.createElement("canvas");
    let ctx = originCanvas.getContext("2d");
    originCanvas.setAttribute("width", w);
    originCanvas.setAttribute("height", h);
    ctx.drawImage(image, 0, 0);
    // 将公司名称、泊位号、车牌号打水印
    ctx.font = '100px Helvetica Neue';
    ctx.fillStyle = "white";
    ctx.textBaseline = "middle";
    ctx.fillText(str[0], 100, 150);
    ctx.fillText(str[1], 500, 150);
    ctx.fillText(str[2], 1100, 150);
    let src1 = originCanvas.toDataURL("image/jpeg");
    // 显示图片打水印之后的效果图
    that.picSrc = src1;
    // 将base64转为文件
    let fileData = dataURLtoFile(src1, "image");
    window.URL.revokeObjectURL(picSrc);
  };
  function dataURLtoFile(dataurl, filename) {
    let arr = dataurl.split(",");
    let mime = arr[0].match(/:(.*?);/)[1];
    let bstr = atob(arr[1]);
    let n = bstr.length;
    let u8arr = new Uint8Array(n);
    while (n--) {
      u8arr[n] = bstr.charCodeAt(n);
    }
    return new File([u8arr], filename, { type: mime });
  }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值