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

2023-11-20

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 });
  }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

js读取jpg图片扩展信息,处理二进制数据 的相关文章

随机推荐

  • socket实验—udp超时设置

    服务端程序 手动设置了丢包 from socket import import random serverport 12000 serverSocket socket AF INET SOCK DGRAM serverSocket bind
  • catia之车灯设计

    初来乍到 初次涉猎 关于我的一些情况的说明 如何画图 大致绘图轮廓 内部结构绘制 总结 初次涉猎 关于我的一些情况的说明 最近入职了一家新公司 主要是使用catia进行车灯的设计 本人之前所进行的三维设计一般都是零件结构类的设计 所绘制的造
  • 不要向全网放通你的ETH系列节点的rpc接口访问权限!!!

    北京时间 2021年 8月 27 日 20 点 50 分左右 区块高度 13107518 一个共识漏洞 利用了 geth v1 10 8 中修复的共识漏洞 袭击了以太坊主网 以太坊因遭到攻击而导致分叉 攻击的根本原因在于 Geth 旧版本在
  • mysql 修改执行delect/update时报错(安全模式)

    MySql运行在safe updates模式下 会导致非主键条件下无法执行update或者delete命令 解决方法 执行命令 关闭安全模式 SET SQL SAFE UPDATES 0 数据处理之后 最好恢复安全模式 SET SQL SA
  • 深入理解Java虚拟机jvm-运行时数据区域

    运行时数据区域 运行时数据区域 程序计数器 Java虚拟机栈 本地方法栈 Java堆 方法区 运行时常量池 直接内存 运行时数据区域 Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域 这些区域有各自的用途
  • MATLAB求解峰值、均值、平均幅值、方差、均方根、方根幅值、最值、峭度、斜度、裕度指标、波形指标、脉冲指标、峰值指标、峭度指标

    MATLAB求解峰值 均值 平均幅值 方差 均方根 方根幅值 最值 峭度 斜度 裕度指标 波形指标 脉冲指标 峰值指标 峭度指标 附代码前 先把代码中的符号注释一下 峰值fz 均值jz Mean error 平均幅值pf 方差fc 均方根j
  • Publish Over SSH插件的使用(jenkins远程服务器发送文件)

    Publish Over SSH ssh插件 用于连接ssh服务器 然后在该服务器上做一些操作 例如连接服务器 部署服务到该服务器上 1 在插件库中查找安装 2 Manager Jenkins gt 系统配置 gt Publish over
  • 为什么都劝运维转开发,却仍看到大批年轻人运维做的风生水起?

    当谈到运维职业发展情况时 很多人都会说运维做不长久 然后劝人做两年就赶快转研发吧 总之是全面唱衰运维 但作为一个老运维 我想说的是 运维转开发确实是一个不错的选择 但运维做不长久则完全是对运维的偏见了 很多人有运维做不长久的偏见的原因其实和
  • 计算机转本考试题,转本”计算机应用基础统一考试试题

    2009年 专转本 计算机应用基础统一考试试题 考试时间90分钟 满分100分 一 单项选择题 1 下列关于集成电路的叙述 正确的是 A 集成电路的集成度将永远符合Moore定律 B 集成电路的工作速度主要取决于组成逻辑门电路的晶体管的尺寸
  • eclipse的全局替换快捷键

    Ctrl H 一 选择需要替换的内容 二 快捷键Ctrl H 选择 File Search gt Replace 三 替换新内容
  • Pycharm 高效编码技巧--模块自动导入

    磨刀不误砍柴工 欢迎大家来到我的博客 Pycharm 拥有丰富的插件 快捷键 具有重构功能和调试技巧 当然是Python编码首选的IDE 不管你导入啥模块 你是回到页头 手动imoprt 喜欢偷懒的我 绝不放弃任何偷懒的技巧 一起来配置一下
  • redis精选面试题2022(持续更新)

    目录 一 redis是单线程还是多线程 二 Redis 为什么用单线程 三 redis是单线程为什么还这么快 1 内存数据库 2 简单的数据结构 3 单线程 4 IO多路复用 四 redis是如何使用跳表来存储的 五 redis没有设置过期
  • [HDLBits] Exams/ece241 2014 q7a

    Design a 1 12 counter with the following inputs and outputs Reset Synchronous active high reset that forces the counter
  • Linux下Nginx编译安装后的开机自启动设置

    Linux下Nginx编译安装后的开机自启动设置 一 查看当前Nginx启动状态 二 而配置Nginx相关服务文件 三 设置nginx命令 四 设置开机启动 五 测试开机启动 一 查看当前Nginx启动状态 root node1 sbin
  • Python编程从入门到实践(六)-用户输入和while循环

    1 函数input 的工作原理 函数input 让程序暂停运行 等待用户输入一些文本 获取用户输入后 Python将其存储在一个变量中 以方便以后使用 例如 下面的程序让用户输入一些文本 再将这些文本呈现给用户 parrot py mess
  • QT5.15.2+MSVC2022编译程序记录

    问题描述及简单分析 使用MinGW在windows上编译的release版exe 然后再使用windeployqt进行打包关联库 在没有msvc环境的电脑中运行还是会出现报错和某些不确定的问题 比如调用pysttx3包的时候 无法正确加载语
  • js仿苹果风格弹出框alert插件

    下载地址 js仿苹果风格弹出框alert插件 多种调用方式 dd
  • Jenkins+Docker持续集成 流程图

    简介 在互联网时代 对于每一家公司 软件开发和发布的重要性不言而喻 目前已经形成一套标准的流程 最重要的组成部分就是持续集成 CI 及持续部署 交付 CD 本文基于Jenkins Docker Git实现一套CI自动化发布流程 传统工作流程
  • 对对对,我放出来了,对对对对对对--对对对对!

    很多同学以为我懒 天天问我怎么一直不发文 是不是懒了 胖了 堕落了 被收变了 其实主要因为我没背景 只有背影 黑屋去吧你 我刚从黑屋出来了 最近发生这么多事 我还说什么 不说了 一切都是对对对对对对对 就对了 还有很多同行的号直接祭了 最近
  • js读取jpg图片扩展信息,处理二进制数据

    js 读取图片扩展信息 将图片转为ArrayBuffer var http new XMLHttpRequest http onload function if this status 200 this status 0 console l