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图片扩展信息,处理二进制数据 的相关文章

  • 是否可以在没有 Javascript(仅 CSS)的情况下执行相同的操作(悬停效果)?

    我正在尝试创建一个带有图标的按钮像这样 http jsfiddle net pRdMc HTML div div class icon div span Send Email span div CSS button width 270px
  • JavaScript 中的“new”关键字是什么?

    The newJavaScript 中的关键字第一次遇到时可能会很混乱 因为人们倾向于认为 JavaScript 不是面向对象的编程语言 它是什么 它解决什么问题 什么时候合适 什么时候不合适 它做了 5 件事 它创建一个新对象 这个对象的
  • Webpack 缺少 CommonsChunk 和 extract-text-webpack-plugin 模块

    我正在跟进Maxime Fabre 的 Webpack 教程 https blog madewithlove be post webpack your bags 我正在尝试获得一个非常简单的 webpack 包 其中包含 1 个入口点和 2
  • 为什么“事件”在 Chrome 中全局可用,而在 Firefox 中则不然?

    在回答另一个问题时 出现了一个与event对象在匿名函数中可用 无需传入 在 Chrome 中 下面的代码工作正常 但 Firefox 会抛出错误 document ready function uspsSideboxTrackingClo
  • 有没有办法监控页面上运行的 JavaScript 函数?

    有没有办法查看页面上正在执行哪些功能 如果我在页面上加载外部脚本 是否可以动态更改函数的功能或阻止其运行 HTML5 http www w3 org TR html5 scripting 1 html establish script bl
  • 获取请求的客户端 IP 地址而不是 Cloudflare 的 IP 地址

    Cloudflare 会更改传入请求的 IP 地址 因为 Cloudflare 是我的网站和互联网之间的中间件 代理 我该怎么办获取请求的初始IP地址 而不是 Cloudflare 的 IP 地址 我听说过mod cloudflare但是这
  • 将数组转换为具有默认值的对象的更简洁方法? (洛达什可用)

    我有一个数组 比如说 a b c 我想将其转换为一个对象 该对象以数组值作为键和我可以设置的默认值 所以如果默认值是true 我希望我的输出是 a true b true c true 下面的代码是否有更简洁的版本来实现此目的 var my
  • 卸载/销毁 Angular 延迟加载组件

    我的设置与此处找到的帖子类似http ify io lazy loading in angularjs http ify io lazy loading in angularjs 处理 Angular 中我的应用程序的各种组件的延迟加载 我
  • 光滑的旋转木马不工作

    我一直在尝试简单地实现 Slick Carousel 的工作 我已按照 Git 页面上的说明进行操作 https github com kenwheeler slick https github com kenwheeler slick 这
  • 改进 D3 序列旭日示例

    This D3示例作为我的出发点 http bl ocks org kerryrodden 7090426 http bl ocks org kerryrodden 7090426 我想更改提供图表的数据 并且我做了以下新示例 http j
  • 单击输入字段会触发窗口调整大小

    我有一个带有徽标 菜单和搜索的标题 当我在桌面上时 我会按该顺序显示所有元素 但如果我的窗口宽度小于 980 像素 菜单会隐藏 有一个切换按钮 并且徽标会与nav并附在徽标之后 如果宽度更大 则徽标将再次分离并附加到 DOM 中的旧位置 w
  • EJS在JS onload函数中访问express变量

    我知道你可以像这样获取 ejs 文件中变量的值 h1 h1 如果我要在同一个 ejs 页面的 onload javascript 函数中使用相同的标题变量 我将如何使用它 例如 这个函数产生一个控制台错误说 未捕获的语法错误 意外的标识符
  • 如何将函数传递给 JavaScript Web Worker

    我想通过一个 或多个 函数传递postMessage 给网络工作者 因为我无法引用常规文件 为了启动 Web Worker 我将一个对象 URL 从 Blob 创建 传递给Worker构造函数 然后我传递一条消息 但到目前为止还没有在消息中
  • 在 php、ajax 或 javascript 中加载进度?

    任何人都知道如何在系统仍在服务器端获取数据的同时在客户端显示加载进度以及完成的百分比 例如 当我在客户端按下 确定 按钮时 它会调用服务器端从数据库收集数据 整个过程可能需要2到3分钟 如何在客户端显示加载进度 大约加载完成了多少 我怎样才
  • 更改时触发跨度文本/html

    jQuery 或 JavaScript 中是否有任何事件在以下情况下触发span标签 text html 已更改 Code span class user location span user location change functio
  • 在 HTML5 中将两个图像合并到一个画布上

    我正在使用 HTML5 canvas 元素 假设我有 2 个 ImageData 对象 我想将它们组合起来放在一张画布上 假设我不关心这些图像如何组合 两个 ImageData 对象具有完全相同的像素数和形状 组合两个图像的最佳方式是什么
  • 从相机视图中拖动锁定在一定距离/半径处的对象

    我在场景中心有一个相机 距离相机 z 400 处有 1 个球体 其父级位于中心 我想从视图中向上 向下 向左 向右拖动球体 但同时不改变它相对于中心的 z 位置 我最终使用了另一个球体并使其不可见 添加side THREE DoubleSi
  • PhantomJS 网页内存消耗?

    是否有一种编程方式 因为我想在运行时自动执行 方式来查看网页在通过 PhantomJs 运行时使用了多少内存 我也在使用 casperjs 如果这有帮助的话 我已经搜索了很多但没有找到任何方法 PhantomJs 使用 QtWebKit 因
  • 在 JSP 或 Javascript 中清除浏览器缓存中的图像

    我正在为一所大学开发JSP Web 应用程序 用户页面中显示人员图片 用户注销后如何从网络浏览器缓存中清除这张图片 使用 JSP 或 JavaScript 那是不可能的 最好的选择是完全禁用相关资源的缓存 创建一个filter https
  • openssl_pkey_get_details($res) 不返回公共指数

    我在用着这个例子 https stackoverflow com a 12575951 2016196使用 php 生成的密钥进行 javascript 加密openssl图书馆 但是 details openssl pkey get de

随机推荐

  • 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