js 将图片链接转成流

最近遇到一个需求,给定图片的 URL 链接,将链接对应的 图片直接转成八进制流,然后在使用八进制流做其他操作,这里为了性能体验,没用使用请求,纯 js 实现,具体实现如下:

实现步骤:

  1. 创建一个 img 标签。
  2. 设置 img 标签的 src 属性为图片链接。
  3. 监听 img 标签的 load 事件,确保图片加载完成后执行下一步。
  4. 创建一个 canvas 元素。
  5. 将 img 标签绘制到 canvas 上。
  6. 获取 canvas 上的像素数据。
  7. 将像素数据转换为八进制字符串。
function imageToOctalStream(imageUrl) {return new Promise((resolve, reject) => {// 创建img标签const img = new Image();img.crossOrigin = 'anonymous'; // 避免跨域问题img.src = imageUrl;// 监听图片加载完成事件img.onload = () => {// 创建canvas元素const canvas = document.createElement('canvas');canvas.width = img.width;canvas.height = img.height;const ctx = canvas.getContext('2d');// 将图片绘制到canvas上ctx.drawImage(img, 0, 0);// 获取canvas上的像素数据const imageData = ctx.getImageData(0, 0, canvas.width, canvas.height);const data = imageData.data;// 方法一:将像素数据转换为八进制字符串let result = '';for (let i = 0; i < data.length; i += 4) {const r = data[i].toString(8).padStart(3, '0');const g = data[i + 1].toString(8).padStart(3, '0');const b = data[i + 2].toString(8).padStart(3, '0');const a = data[i + 3].toString(8).padStart(3, '0');result += r + g + b + a;}// // 方法二:创建一个Uint8Array来存储像素数据// const result = new Uint8Array(data.length);// // 将像素数据转换为Uint8Array// for (let i = 0; i < data.length; i++) {//   result[i] = data[i];// }// 返回 resultresolve(result);};// 监听图片加载失败事件img.onerror = (error) => {reject(error);};});
}const imageUrl = 'https://example.com/image.jpg'; // 需要替换成你的图片链接
imageToOctalStream(imageUrl).then((result) => {console.log('转化成功', result);}).catch((error) => {console.error('转换失败:', error);});

这里也用到了 crossOrigin 这个属性,用于设置图像的跨域策略。它决定了浏览器在加载图像时如何处理跨域请求。

crossOrigin 设置为 "anonymous" 时,浏览器会发起一个跨域请求,但不会发送任何凭据(如cookies)。这通常用于不需要用户凭据的跨域图片请求。

crossOrigin 设置为 "use-credentials" 时,浏览器会发起一个带有凭据的跨域请求。这意味着浏览器会将用户的凭据(如cookies)发送给服务器,以便进行身份验证和授权。

如果 crossOrigin 未设置或设置为空字符串,则表示不进行任何跨域请求,即同源策略。在这种情况下,浏览器只会从与当前页面相同的域名加载图像。

如下示例中,图像将从 https://example.com 加载,并且浏览器将使用匿名跨域请求来获取图像数据:

<img src="https://example.com/image.jpg" crossOrigin="anonymous">

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1550976.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

在线PDF怎么转换成JPG图片?分享14种转换操作!

作为一名社畜&#xff0c;俺也经常要将PDF转换为图片格式&#xff01; 如何进行快速转换&#xff0c;包括电脑端、在线端和手机端&#xff0c;今天俺就测评了50款工具&#xff0c;给你得出了下面这些渠道&#xff0c;不少也是免费的&#xff0c;相信对你有帮助哦&#xff01; …

Spring - @Import注解

文章目录 基本用法源码分析ConfigurationClassPostProcessorConfigurationClass SourceClassgetImportsprocessImports处理 ImportSelectorImportSelector 接口DeferredImportSelector 处理 ImportBeanDefinitionRegistrarImportBeanDefinitionRegistrar 接口 处理Configuratio…

2-3树(2-3 Tree):原理、常见算法及其应用

目录 引言 2-3树的基本概念 常见算法 查找节点 插入节点 删除节点 2-3树的应用场景 1. 文件系统目录管理 应用原理 场景描述 2. 字典编码 应用原理 场景描述 总结 优势对比 自平衡特性 灵活的节点结构 高效的操作性能 简单的实现 广泛的应用场景 数据一致…

遥感图像分割

遥感图像分割是一种应用于遥感图像的计算机视觉技术&#xff0c;用于将图像划分为不同的区域&#xff0c;每个区域代表地表的不同特征&#xff0c;如水体、森林、城市区域等。这种分割帮助我们更好地理解和分析地球表面的变化&#xff0c;对于环境监测、城市规划、农业、灾害管…

AR技术在电商行业的应用及优势有哪些?

AR&#xff08;增强现实&#xff09;技术在电商行业的应用广泛且深入&#xff0c;为消费者带来了全新的购物体验&#xff0c;同时也为商家带来了诸多优势。以下是AR技术在电商行业的主要应用场景及其优势&#xff1a; 一、应用场景 1、虚拟商品展示与试用 家具AR摆放&#x…

济南站活动回顾|IvorySQL中的Oracle XML函数使用示例及技术实现原理

近日&#xff0c;由中国开源软件推进联盟PG分会 & 齐鲁软件园联合发起的“PostgreSQL技术峰会济南站”在齐鲁开源社举办。瀚高股份IvorySQL作为合作伙伴受邀参加此次活动。 瀚高股份IvorySQL技术工程师 向逍 带来「IvorySQL中的Oracle XML函数兼容」的议题分享。在演讲中&a…

前端vue-form表单的验证

form表单验证的完整步骤

二叉树的中序遍历(java)

概述 关于二叉树&#xff0c;我们都不陌生&#xff0c;许多基于递归的问题发起点都是一个二叉树的root节点。对于各种二叉树的问题&#xff0c;我们也是通过dfs进行求解。例如求二叉树的深度、最近公共祖先等 算法分析 关于二叉树的中序遍历&#xff0c;我们都知道应该先访…

【C++单调队列】1438. 绝对差不超过限制的最长连续子数组|1672

本文时间知识点 C队列、双向队列 LeetCode1438. 绝对差不超过限制的最长连续子数组 给你一个整数数组 nums &#xff0c;和一个表示限制的整数 limit&#xff0c;请你返回最长连续子数组的长度&#xff0c;该子数组中的任意两个元素之间的绝对差必须小于或者等于 limit 。 如…

Flume实战--Flume中的选择器、自动容灾(故障转移)、负载均衡的详解与操作

本文详细介绍了Apache Flume的关键特性&#xff0c;包括选择器、拦截器、故障转移和负载均衡。选择器负责将数据分发到多个Channel&#xff0c;拦截器用于修改或丢弃Event。故障转移机制能够在Sink故障时自动切换&#xff0c;而负载均衡则在多个Sink间分配负载。文章还提供了自…

CANoe_DBC能够打开但是无法使用“BusType”

解决DBC文件在CAPL中调用问题&#xff1a;从CANdb到CAPL的顺畅过渡 在汽车电子和嵌入式系统开发中&#xff0c;DBC&#xff08;Database CAN&#xff09;文件作为描述CAN&#xff08;Controller Area Network&#xff09;通信协议的重要工具&#xff0c;广泛应用于网络设计、测…

工作日志:ruoyi-vue-plus echarts根据窗口大小变化

1、echarts根据窗口大小变化。 onMounted(() > {// 折线图type EChartsOption echarts.EChartsOption;var chartDom document.getElementById(chartDom)!;var myChart echarts.init(chartDom);var option: EChartsOption;option {grid: {left: 35,top: 10,bottom: 30,r…

jenkins部署Maven和NodeJS项目

在 Java 项目开发中&#xff0c;项目的编译、测试、打包等是比较繁琐的&#xff0c;属于重复劳动的工作&#xff0c;浪费人力和时间成本。以往开发项目时&#xff0c;程序员往往需要花较多的精力在引用 jar 包搭建项目环境上&#xff0c;跨部门甚至跨人员之间的项目结构都有可能…

1.8 软件业务测试

欢迎大家订阅【软件测试】 专栏&#xff0c;开启你的软件测试学习之旅&#xff01; 文章目录 前言1 概述2 方法3 测试策略4 案例分析 前言 在软件开发生命周期中&#xff0c;业务测试扮演着至关重要的角色。本文详细讲解了业务测试的定义、目的、方法以及测试策略。 本篇文章参…

C++队列、双向队列

前言 C算法与数据结构 打开打包代码的方法兼述单元测试 队列 队列&#xff08;Queue&#xff09;是一种基本的线性数据结构&#xff0c;它遵循先进先出&#xff08;First In First Out, FIFO&#xff09;的原则。这意味着最先被添加到队列中的元素将会是最先被移除的。和生活…

命令回显echo

命令回显 通常&#xff0c;make在执行命令行之前会把要执行的命令行进行输出。我们称之为“回显”&#xff0c;就好像我们输入命令执行一样。 如果要执行的命令行以字符“”开始&#xff0c;则make在执行时这个命令就不会被回显。典型的用法是我们在使用“echo”命令输出一些信…

Github 2024-09-29 php开源项目日报 Top10

根据Github Trendings的统计,今日(2024-09-29统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量PHP项目10Blade项目1Java项目1ASP项目1Coolify: 开源自助云平台 创建周期:1112 天开发语言:PHP, Blade协议类型:Apache License 2.0Star数量…

Java多线程几个哈希表的区别

HashMap 首先HashMap肯定是不行的,并没有加解锁操作,一旦多线程同时写的话,直接就会发生覆盖之类的操作 排除HashMap先,主要对比HashTable和ConcurrentHashMap HashTable vs ConcurrentHashMap 1. 加锁粒度不同 HashTable HashTable是对整个哈希表进行加锁操作,任何增删改查操…

数据结构串的kmp相关(求next和nextval)

傻瓜版&#xff0c;用来演示手算过程&#xff0c;个人理解用的&#xff0c;仅供参考。

CICD Jenkins实现Pipline

一、安装 1、由于 Jenkins 是基于 Java 的&#xff0c;首先需要确保你的系统中安装了 Java。推荐使用 OpenJDK 11。可以通过以下命令安装&#xff1a; apt update apt install openjdk-11-jdk2、在安装 Jenkins 之前&#xff0c;你需要将其仓库添加到你的系统中。首先&#x…