js 之图片流式转换及图片处理+createObjectURL+canvas+webgl+buffer

文章目录

    • js 图片 文件流前端处理
      • 使用 fetch API
      • 使用 XMLHttpRequest
    • js 对后端返回的图片处理和显示
      • 1. 使用fetch获取图片数据并转换为`Blob`对象
      • 2. 使用canvas进行复杂图像处理
      • 3. 使用WebGL进行高性能图像处理(适用于更复杂和大规模的处理)
    • 框架应用之buffer处理

js 图片 文件流前端处理

在JavaScript中,要对后端返回的图片或文件进行流式转化显示,可以通过 XMLHttpRequest (或者更现代的 fetch API)获取数据,然后使用 Blob 对象和 URL.createObjectURL 来创建一个可用于显示的URL。以下是分别使用 fetchXMLHttpRequest 的示例:

使用 fetch API

  1. 获取图片或文件数据
    • 使用 fetch 发起请求获取数据。
    • 将响应数据转换为 Blob 对象。
    • 使用 URL.createObjectURL 创建一个URL,用于在页面上显示图片或提供文件下载链接。
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Streaming Image/File</title>
</head>

<body>
    <img id="image-display" alt="Loaded Image">
    <a id="file-download" download="downloaded_file">Download File</a>
    <script>
        const imageDisplay = document.getElementById('image-display');
        const fileDownload = document.getElementById('file-download');

        // 假设后端返回图片或文件的URL
        const apiUrl = 'your-api-url';

        fetch(apiUrl)
          .then(response => response.blob())
          .then(blob => {
                // 显示图片
                const imageUrl = URL.createObjectURL(blob);
                imageDisplay.src = imageUrl;

                // 设置文件下载链接
                fileDownload.href = imageUrl;
                fileDownload.textContent = 'Download File';
            })
          .catch(error => {
                console.error('Error fetching data:', error);
            });
    </script>
</body>

</html>

使用 XMLHttpRequest

  1. 创建 XMLHttpRequest 对象
    • 初始化请求并设置响应类型为 blob
    • 监听 readystatechange 事件,当状态为 4(完成)且状态码为 200(成功)时,处理响应数据。
    • 使用 URL.createObjectURL 创建URL用于显示图片或下载文件。
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Streaming Image/File with XHR</title>
</head>

<body>
    <img id="image-display-xhr" alt="Loaded Image">
    <a id="file-download-xhr" download="downloaded_file">Download File</a>
    <script>
        const imageDisplayXHR = document.getElementById('image-display-xhr');
        const fileDownloadXHR = document.getElementById('file-download-xhr');

        const xhr = new XMLHttpRequest();
        const apiUrl = 'your-api-url';
        xhr.open('GET', apiUrl, true);
        xhr.responseType = 'blob';

        xhr.onreadystatechange = function () {
            if (xhr.readyState === 4 && xhr.status === 200) {
                const blob = xhr.response;
                // 显示图片
                const imageUrl = URL.createObjectURL(blob);
                imageDisplayXHR.src = imageUrl;

                // 设置文件下载链接
                fileDownloadXHR.href = imageUrl;
                fileDownloadXHR.textContent = 'Download File';
            }
        };

        xhr.send();
    </script>
</body>

</html>

在上述代码中:

  • 对于图片,通过设置 img 元素的 src 属性来显示。
  • 对于文件下载,通过设置 a 元素的 hrefdownload 属性来提供下载链接。

请将 'your-api-url' 替换为实际后端返回图片或文件的API地址。同时,确保后端设置了正确的响应头,允许前端访问返回的数据。例如,对于跨域请求,后端可能需要设置 Access - Control - Allow - Origin 头。

js 对后端返回的图片处理和显示

在JavaScript中处理后端返回的图片并在前端显示,常见的操作包括调整图片大小、添加滤镜、裁剪等。以下以调整图片大小和添加高斯模糊滤镜为例,展示如何对后端返回的图片进行处理并显示。

1. 使用fetch获取图片数据并转换为Blob对象

首先,使用fetch API从后端获取图片数据,并将响应转换为Blob对象。之后可以基于这个Blob对象创建Image对象进行后续处理。

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Process Image</title>
</head>

<body>
    <canvas id="processed-canvas"></canvas>
    <script>
        const canvas = document.getElementById('processed-canvas');
        const ctx = canvas.getContext('2d');

        // 假设后端返回图片的URL
        const apiUrl = 'your-api-url';

        fetch(apiUrl)
         .then(response => response.blob())
         .then(blob => {
                const img = new Image();
                img.src = URL.createObjectURL(blob);
                img.onload = function () {
                    // 在这里进行图片处理
                    // 例如调整大小
                    const newWidth = 200;
                    const newHeight = 200;
                    canvas.width = newWidth;
                    canvas.height = newHeight;
                    ctx.drawImage(img, 0, 0, newWidth, newHeight);

                    // 例如添加高斯模糊滤镜(通过应用CSS滤镜模拟,实际高斯模糊更复杂,
                    // 这里简单示意)
                    canvas.style.filter = 'blur(5px)';
                };
            })
         .catch(error => {
                console.error('Error fetching data:', error);
            });
    </script>
</body>

</html>

2. 使用canvas进行复杂图像处理

canvas提供了强大的2D绘图API,可以进行更复杂的图像处理,如裁剪、像素操作等。以下是一个裁剪图片的示例:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Process Image - Crop</title>
</head>

<body>
    <canvas id="cropped-canvas"></canvas>
    <script>
        const canvas = document.getElementById('cropped-canvas');
        const ctx = canvas.getContext('2d');

        const apiUrl = 'your-api-url';

        fetch(apiUrl)
         .then(response => response.blob())
         .then(blob => {
                const img = new Image();
                img.src = URL.createObjectURL(blob);
                img.onload = function () {
                    // 裁剪图片
                    const cropX = 50;
                    const cropY = 50;
                    const cropWidth = 100;
                    const cropHeight = 100;
                    canvas.width = cropWidth;
                    canvas.height = cropHeight;
                    ctx.drawImage(img, cropX, cropY, cropWidth, cropHeight,
                     0, 0, cropWidth, cropHeight);
                };
            })
         .catch(error => {
                console.error('Error fetching data:', error);
            });
    </script>
</body>

</html>

3. 使用WebGL进行高性能图像处理(适用于更复杂和大规模的处理)

WebGL是基于OpenGL ES 2.0的JavaScript API,用于在网页上进行硬件加速的3D图形渲染,也可用于高性能的2D图像处理。以下是一个简单的使用WebGL显示图片的示例框架(实际的图像处理需要编写着色器等更复杂的操作):

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>WebGL Image</title>
</head>

<body>
    <canvas id="webgl-canvas"></canvas>
    <script>
        const canvas = document.getElementById('webgl-canvas');
        const gl = canvas.getContext('webgl');

        const apiUrl = 'your-api-url';

        fetch(apiUrl)
         .then(response => response.blob())
         .then(blob => {
                const img = new Image();
                img.src = URL.createObjectURL(blob);
                img.onload = function () {
                    // 设置WebGL视口
                    gl.viewport(0, 0, gl.canvas.width, gl.canvas.height);

                    // 这里省略创建着色器、缓冲区等复杂步骤
                    // 简单来说,后续需要将图片数据传递给WebGL并进行渲染
                };
            })
         .catch(error => {
                console.error('Error fetching data:', error);
            });
    </script>
</body>

</html>

在上述示例中,将'your-api-url'替换为实际的后端返回图片的API地址。这些示例展示了从获取图片到在前端进行不同程度处理并显示的过程。根据具体需求,可以选择合适的处理方式和技术。

框架应用之buffer处理

  1. 使用 fetch 获取图片并显示
    • 假设后端提供一个图片的API接口,前端通过 fetch 获取图片数据,将其转换为 Blob 对象,生成URL并显示在 img 标签中。
    • 以下是一个完整的HTML页面示例:
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Image Blob Example</title>
</head>

<body>
    <img id="displayed-image" alt="Loaded Image">
    <script>
        const displayedImage = document.getElementById('displayed-image');
        const apiUrl = 'your - api - url';// 替换为实际的API地址

        fetch(apiUrl)
         .then(response => response.arrayBuffer())
         .then(buffer => {
                const blob = new Blob([buffer], { type: 'image/png' });
                let src = window.URL.createObjectURL(blob);
                displayedImage.src = src;
            })
         .catch(error => {
                console.error('Error fetching data:', error);
            });
    </script>
</body>

</html>
  1. 在Vue.js中的使用示例
    • 假设你有一个Vue组件,在组件中从后端获取图片并显示。
    • 首先确保你已经安装并引入了Vue.js。
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Vue Image Blob Example</title>
    <script src="https://cdn.jsdelivr.net/npm/vue@2.6.14/dist/vue.js"></script>
</head>

<body>
    <div id="app">
        <img :src="imgUrl" alt="Loaded Image">
    </div>
    <script>
        new Vue({
            el: '#app',
            data() {
                return {
                    imgUrl: ''
                };
            },
            mounted() {
                const apiUrl = 'your-api-url';// 替换为实际的API地址
                fetch(apiUrl)
                 .then(response => response.arrayBuffer())
                 .then(buffer => {
                        const blob = new Blob([buffer], { type: 'image/png' });
                        this.imgUrl = window.URL.createObjectURL(blob);
                    })
                 .catch(error => {
                        console.error('Error fetching data:', error);
                    });
            }
        });
    </script>
</body>

</html>
  1. 在React中的使用示例
    • 创建一个React组件来从后端获取图片并显示。
    • 假设你已经设置好React开发环境(例如使用 create-react-app)。
import React, { useEffect, useState } from'react';

function ImageComponent() {
    const [imgUrl, setImgUrl] = useState('');
    const apiUrl = 'your - api - url';// 替换为实际的API地址

    useEffect(() => {
        fetch(apiUrl)
         .then(response => response.arrayBuffer())
         .then(buffer => {
                const blob = new Blob([buffer], { type: 'image/png' });
                setImgUrl(window.URL.createObjectURL(blob));
            })
         .catch(error => {
                console.error('Error fetching data:', error);
            });
    }, []);

    return <img src={imgUrl} alt="Loaded Image" />;
}

export default ImageComponent;

在上述示例中,your - api - url 都需要替换为实际返回图片数据的后端API地址。在实际应用中,你可能需要处理不同的图片格式(如 image/jpeg 等),并且根据具体情况调整 Blobtype 参数。同时,要注意处理可能出现的跨域问题,后端可能需要设置适当的CORS(跨域资源共享)头。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

中建海龙:科技助力福城南产业片区绿色建筑发展

在快速发展的城市化进程中&#xff0c;绿色建筑以其环保、节能、可持续的特点日益受到重视。作为建筑工业化领域的领军企业&#xff0c;中建海龙科技有限公司&#xff08;简称“中建海龙”&#xff09;凭借其卓越的科技实力和创新举措&#xff0c;在推动绿色建筑发展方面做出了…

OJ随机链表的复制题目分析

题目内容&#xff1a; 138. 随机链表的复制 - 力扣&#xff08;LeetCode&#xff09; 分析&#xff1a; 这道题目&#xff0c;第一眼感觉非常乱&#xff0c;这是正常的&#xff0c;但是我们经过仔细分析示例明白后&#xff0c;其实也并不是那么难。现在让我们一起来分析分析…

动态规划回文串问题系列一>回文子串

题目&#xff1a; 解析&#xff1a; 注意&#xff1a;字串和子数组差不多 状态表示&#xff1a; 状态转移方程&#xff1a; 初始化&#xff1a; 填表顺序&#xff1a; 返回值&#xff1a; 返回dp表里true的个数

万里数据库GreatSQL监控解析

GreatSQL是MySQL的一个分支&#xff0c;专注于提升MGR&#xff08;MySQL Group Replication&#xff09;的可靠性及性能。乐维监控平台可以有效地监控GreatSQL&#xff0c;帮助用户及时发现并解决潜在的性能问题。 通过在GreatSQL服务器上安装监控代理&#xff0c;收集数据库性…

君正T41交叉编译ffmpeg、opencv并做h264软解,利用君正SDK做h264硬件编码

目录 1 交叉编译ffmpeg----错误解决过程&#xff0c;不要看 1.1 下载源码 1.2 配置 1.3 编译 安装 1.3.1 报错&#xff1a;libavfilter/libavfilter.so: undefined reference to fminf 1.3.2 报错&#xff1a;error: unknown type name HEVCContext; did you mean HEVCPr…

Sublime Text4 4189 安装激活【 2025年1月3日 亲测可用】

-----------------测试时间2025年1月3日------------------- 下载地址 官方网址&#xff1a;https://www.sublimetext.com 更新日志&#xff1a;https://www.sublimetext.com/download V4189 64位&#xff1a;https://www.sublimetext.com/download_thanks?targetwin-x64 ....…

Zabbix5.0版本(监控Nginx+PHP服务状态信息)

目录 1.监控Nginx服务状态信息 &#xff08;1&#xff09;通过Nginx监控模块&#xff0c;监控Nginx的7种状态 &#xff08;2&#xff09;开启Nginx状态模块 &#xff08;3&#xff09;配置监控项 &#xff08;4&#xff09;创建模板 &#xff08;5&#xff09;用默认键值…

Java高频面试之SE-08

hello啊&#xff0c;各位观众姥爷们&#xff01;&#xff01;&#xff01;本牛马baby今天又来了&#xff01;哈哈哈哈哈嗝&#x1f436; 成员变量和局部变量的区别有哪些&#xff1f; 在 Java 中&#xff0c;成员变量和局部变量是两种不同类型的变量&#xff0c;它们在作用域…

Linux(Centos 7.6)命令行快捷键

Linux(Centos 7.6)操作系统一般都是使用命令行进行管理&#xff0c;如何能高效的进行命令编辑与执行&#xff0c;需要我们记住一些常见的命令&#xff0c;也需要连接一些常见快捷键的使用&#xff0c;常见快捷键如下&#xff1a; 快捷键快捷键说明tab命令行补齐ctrlr快速查找之…

Geoserver修行记-后端调用WMS/WMTS服务无找不到图层Could not find layer

项目场景 调用geoserver地图服务WMS,找不到图层 我在进行地图服务调用的时候&#xff0c;总是提示我找不多图层 Could not find layer&#xff0c;重点是这个图层我明明是定义了&#xff0c;发布了&#xff0c;且还能够正常查看图层的wms的样式&#xff0c;但是在调用后端调用…

ip属地的信息准确吗?ip归属地不准确怎么办

在数字化时代&#xff0c;IP属地信息成为了我们日常生活中不可或缺的一部分。在各大社交媒体平台上&#xff0c;IP属地信息都扮演着重要的角色。然而&#xff0c;随着技术的不断进步和网络的复杂性增加&#xff0c;IP属地信息的准确性问题也日益凸显。那么&#xff0c;IP属地信…

nginx高可用集群搭建

本文介绍nginx高可用集群的搭建。利用keepalived实时检查nginx进程是否存活、keepalived的虚拟ip技术&#xff0c;达到故障转移的目的。终端用户通过访问虚拟ip&#xff0c;感知不到实际发生的故障。架构图如下&#xff1a; 0、环境 Ubuntu&#xff1a;22.04.2 ltsnginx: 1.…

UE5材质节点Distance

Distance可以计算两个物体间的距离&#xff0c;可以用来做过渡效果 当相机和物体距离3000的时候&#xff0c;就会渐渐从蓝过渡到红色&#xff0c;除以500是为了平滑过渡

CS·GO搬砖流程详细版

说简单点&#xff0c;就是Steam买了然后BUFF上卖&#xff0c;或许大家都知道这点&#xff0c;但就是一些操作和细节问题没那么明白。我相信&#xff0c;你看完这篇文章以后&#xff0c;至少会有新的认知。 好吧&#xff0c;废话少说&#xff0c;直接上实操&#xff01; 首先准…

【Cocos TypeScript 零基础 3.1】

目录 场景跳转 场景跳转 把新建好的TS文件与场景绑定 选中 场景 或 camera 拖进右边的 属性检查器 双击T文件,进入编辑 至于用什么IDE看个位朋友高兴 我这里有 VScode ,先用这个,老师也没有推荐 (老师也用的是这个) VScode UI 也有中文包,请自行上网搜索 打开创建的TS文件后…

分析服务器 systemctl 启动gozero项目报错的解决方案

### 分析 systemctl start beisen.service 报错 在 Linux 系统中&#xff0c;systemctl 是管理系统和服务的主要工具。当我们尝试重启某个服务时&#xff0c;如果服务启动失败&#xff0c;systemctl 会输出错误信息&#xff0c;帮助我们诊断和解决问题。 本文将通过一个实际的…

pd虚拟机 Parallels Desktop 20 for Mac 安装教程【支持M芯片】

文章目录 效果图一、下载软件二、安装运行⚠️注意事项&#xff1a;1、前往 系统设置–> 隐私与安全性 –> 完整磁盘访问权限&#xff0c;中允许终端&#xff1a;2、安装运行【ParallelsDesktop-20.1.2-55742.dmg】&#xff0c;运行【安装.app】3、将【Patch】文件夹拖到…

回归预测 | MATLAB实现CNN-GRU卷积门控循环单元多输入单输出回归预测

回归预测 | MATLAB实现CNN-GRU卷积门控循环单元多输入单输出回归预测 目录 回归预测 | MATLAB实现CNN-GRU卷积门控循环单元多输入单输出回归预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 MATLAB实现CNN-GRU卷积门控循环单元多输入单输出回归预测 数据准备&#x…

JAVA创建绘图板JAVA构建主窗口鼠标拖动来绘制线条

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c; 忍不住分享一下给大家。点击跳转到网站 学习总结 1、掌握 JAVA入门到进阶知识(持续写作中……&#xff09; 2、学会Oracle数据库入门到入土用法(创作中……&#xff09; 3、手把…

CSS层叠样式表

目标 能够说出什么是CSS能够使用CSS基础选择器能够设置字体样式能够设置文本样式能够说出CSS的三种引入方式能够使用Chrome调试工具调试样式 目录 CSS简介CSS基础选择器CSS字体属性CSS文本属性CSS的引入方式综合案例Chrome调试工具 1.1 HTML的局限性 说起HTML&#xff0c;…