js 之图片流式转换及图片处置惩罚+createObjectURL+canvas+webgl+buffer ...

铁佛  金牌会员 | 2025-3-24 00:02:29 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 977|帖子 977|积分 2931

js 图片 文件流前端处置惩罚

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


  • 获取图片或文件数据

    • 使用 fetch 发起请求获取数据。
    • 将相应数据转换为 Blob 对象。
    • 使用 URL.createObjectURL 创建一个URL,用于在页面上显示图片或提供文件下载链接。

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4.     <meta charset="UTF-8">
  5.     <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6.     <title>Streaming Image/File</title>
  7. </head>
  8. <body>
  9.     <img id="image-display" alt="Loaded Image">
  10.     <a id="file-download" download="downloaded_file">Download File</a>
  11.     <script>
  12.         const imageDisplay = document.getElementById('image-display');
  13.         const fileDownload = document.getElementById('file-download');
  14.         // 假设后端返回图片或文件的URL
  15.         const apiUrl = 'your-api-url';
  16.         fetch(apiUrl)
  17.           .then(response => response.blob())
  18.           .then(blob => {
  19.                 // 显示图片
  20.                 const imageUrl = URL.createObjectURL(blob);
  21.                 imageDisplay.src = imageUrl;
  22.                 // 设置文件下载链接
  23.                 fileDownload.href = imageUrl;
  24.                 fileDownload.textContent = 'Download File';
  25.             })
  26.           .catch(error => {
  27.                 console.error('Error fetching data:', error);
  28.             });
  29.     </script>
  30. </body>
  31. </html>
复制代码
使用 XMLHttpRequest


  • 创建 XMLHttpRequest 对象

    • 初始化请求并设置相应范例为 blob。
    • 监听 readystatechange 事件,当状态为 4(完成)且状态码为 200(乐成)时,处置惩罚相应数据。
    • 使用 URL.createObjectURL 创建URL用于显示图片或下载文件。

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4.     <meta charset="UTF-8">
  5.     <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6.     <title>Streaming Image/File with XHR</title>
  7. </head>
  8. <body>
  9.     <img id="image-display-xhr" alt="Loaded Image">
  10.     <a id="file-download-xhr" download="downloaded_file">Download File</a>
  11.     <script>
  12.         const imageDisplayXHR = document.getElementById('image-display-xhr');
  13.         const fileDownloadXHR = document.getElementById('file-download-xhr');
  14.         const xhr = new XMLHttpRequest();
  15.         const apiUrl = 'your-api-url';
  16.         xhr.open('GET', apiUrl, true);
  17.         xhr.responseType = 'blob';
  18.         xhr.onreadystatechange = function () {
  19.             if (xhr.readyState === 4 && xhr.status === 200) {
  20.                 const blob = xhr.response;
  21.                 // 显示图片
  22.                 const imageUrl = URL.createObjectURL(blob);
  23.                 imageDisplayXHR.src = imageUrl;
  24.                 // 设置文件下载链接
  25.                 fileDownloadXHR.href = imageUrl;
  26.                 fileDownloadXHR.textContent = 'Download File';
  27.             }
  28.         };
  29.         xhr.send();
  30.     </script>
  31. </body>
  32. </html>
复制代码
在上述代码中:


  • 对于图片,通过设置 img 元素的 src 属性来显示。
  • 对于文件下载,通过设置 a 元素的 href 和 download 属性来提供下载链接。
请将 'your-api-url' 更换为实际后端返回图片或文件的API地点。同时,确保后端设置了精确的相应头,允许前端访问返回的数据。比方,对于跨域请求,后端可能需要设置 Access - Control - Allow - Origin 头。
js 对后端返回的图片处置惩罚和显示

在JavaScript中处置惩罚后端返回的图片并在前端显示,常见的操纵包括调整图片大小、添加滤镜、裁剪等。以下以调整图片大小和添加高斯模糊滤镜为例,展示怎样对后端返回的图片进行处置惩罚并显示。
1. 使用fetch获取图片数据并转换为Blob对象

起首,使用fetch API从后端获取图片数据,并将相应转换为Blob对象。之后可以基于这个Blob对象创建Image对象进行后续处置惩罚。
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4.     <meta charset="UTF-8">
  5.     <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6.     <title>Process Image</title>
  7. </head>
  8. <body>
  9.     <canvas id="processed-canvas"></canvas>
  10.     <script>
  11.         const canvas = document.getElementById('processed-canvas');
  12.         const ctx = canvas.getContext('2d');
  13.         // 假设后端返回图片的URL
  14.         const apiUrl = 'your-api-url';
  15.         fetch(apiUrl)
  16.          .then(response => response.blob())
  17.          .then(blob => {
  18.                 const img = new Image();
  19.                 img.src = URL.createObjectURL(blob);
  20.                 img.onload = function () {
  21.                     // 在这里进行图片处理
  22.                     // 例如调整大小
  23.                     const newWidth = 200;
  24.                     const newHeight = 200;
  25.                     canvas.width = newWidth;
  26.                     canvas.height = newHeight;
  27.                     ctx.drawImage(img, 0, 0, newWidth, newHeight);
  28.                     // 例如添加高斯模糊滤镜(通过应用CSS滤镜模拟,实际高斯模糊更复杂,
  29.                     // 这里简单示意)
  30.                     canvas.style.filter = 'blur(5px)';
  31.                 };
  32.             })
  33.          .catch(error => {
  34.                 console.error('Error fetching data:', error);
  35.             });
  36.     </script>
  37. </body>
  38. </html>
复制代码
2. 使用canvas进行复杂图像处置惩罚

canvas提供了强盛的2D绘图API,可以进行更复杂的图像处置惩罚,如裁剪、像素操纵等。以下是一个裁剪图片的示例:
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4.     <meta charset="UTF-8">
  5.     <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6.     <title>Process Image - Crop</title>
  7. </head>
  8. <body>
  9.     <canvas id="cropped-canvas"></canvas>
  10.     <script>
  11.         const canvas = document.getElementById('cropped-canvas');
  12.         const ctx = canvas.getContext('2d');
  13.         const apiUrl = 'your-api-url';
  14.         fetch(apiUrl)
  15.          .then(response => response.blob())
  16.          .then(blob => {
  17.                 const img = new Image();
  18.                 img.src = URL.createObjectURL(blob);
  19.                 img.onload = function () {
  20.                     // 裁剪图片
  21.                     const cropX = 50;
  22.                     const cropY = 50;
  23.                     const cropWidth = 100;
  24.                     const cropHeight = 100;
  25.                     canvas.width = cropWidth;
  26.                     canvas.height = cropHeight;
  27.                     ctx.drawImage(img, cropX, cropY, cropWidth, cropHeight,
  28.                      0, 0, cropWidth, cropHeight);
  29.                 };
  30.             })
  31.          .catch(error => {
  32.                 console.error('Error fetching data:', error);
  33.             });
  34.     </script>
  35. </body>
  36. </html>
复制代码
3. 使用WebGL进行高性能图像处置惩罚(适用于更复杂和大规模的处置惩罚)

WebGL是基于OpenGL ES 2.0的JavaScript API,用于在网页上进行硬件加快的3D图形渲染,也可用于高性能的2D图像处置惩罚。以下是一个简朴的使用WebGL显示图片的示例框架(实际的图像处置惩罚需要编写着色器等更复杂的操纵):
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4.     <meta charset="UTF-8">
  5.     <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6.     <title>WebGL Image</title>
  7. </head>
  8. <body>
  9.     <canvas id="webgl-canvas"></canvas>
  10.     <script>
  11.         const canvas = document.getElementById('webgl-canvas');
  12.         const gl = canvas.getContext('webgl');
  13.         const apiUrl = 'your-api-url';
  14.         fetch(apiUrl)
  15.          .then(response => response.blob())
  16.          .then(blob => {
  17.                 const img = new Image();
  18.                 img.src = URL.createObjectURL(blob);
  19.                 img.onload = function () {
  20.                     // 设置WebGL视口
  21.                     gl.viewport(0, 0, gl.canvas.width, gl.canvas.height);
  22.                     // 这里省略创建着色器、缓冲区等复杂步骤
  23.                     // 简单来说,后续需要将图片数据传递给WebGL并进行渲染
  24.                 };
  25.             })
  26.          .catch(error => {
  27.                 console.error('Error fetching data:', error);
  28.             });
  29.     </script>
  30. </body>
  31. </html>
复制代码
在上述示例中,将'your-api-url'更换为实际的后端返回图片的API地点。这些示例展示了从获取图片到在前端进行不同程度处置惩罚并显示的过程。根据详细需求,可以选择符合的处置惩罚方式和技术。
框架应用之buffer处置惩罚


  • 使用 fetch 获取图片并显示

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

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4.     <meta charset="UTF-8">
  5.     <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6.     <title>Image Blob Example</title>
  7. </head>
  8. <body>
  9.     <img id="displayed-image" alt="Loaded Image">
  10.     <script>
  11.         const displayedImage = document.getElementById('displayed-image');
  12.         const apiUrl = 'your - api - url';// 替换为实际的API地址
  13.         fetch(apiUrl)
  14.          .then(response => response.arrayBuffer())
  15.          .then(buffer => {
  16.                 const blob = new Blob([buffer], { type: 'image/png' });
  17.                 let src = window.URL.createObjectURL(blob);
  18.                 displayedImage.src = src;
  19.             })
  20.          .catch(error => {
  21.                 console.error('Error fetching data:', error);
  22.             });
  23.     </script>
  24. </body>
  25. </html>
复制代码

  • 在Vue.js中的使用示例

    • 假设你有一个Vue组件,在组件中从后端获取图片并显示。
    • 起首确保你已经安装并引入了Vue.js。

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4.     <meta charset="UTF-8">
  5.     <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6.     <title>Vue Image Blob Example</title>
  7.     <script src="https://cdn.jsdelivr.net/npm/vue@2.6.14/dist/vue.js"></script>
  8. </head>
  9. <body>
  10.     <div id="app">
  11.         <img :src="imgUrl" alt="Loaded Image">
  12.     </div>
  13.     <script>
  14.         new Vue({
  15.             el: '#app',
  16.             data() {
  17.                 return {
  18.                     imgUrl: ''
  19.                 };
  20.             },
  21.             mounted() {
  22.                 const apiUrl = 'your-api-url';// 替换为实际的API地址
  23.                 fetch(apiUrl)
  24.                  .then(response => response.arrayBuffer())
  25.                  .then(buffer => {
  26.                         const blob = new Blob([buffer], { type: 'image/png' });
  27.                         this.imgUrl = window.URL.createObjectURL(blob);
  28.                     })
  29.                  .catch(error => {
  30.                         console.error('Error fetching data:', error);
  31.                     });
  32.             }
  33.         });
  34.     </script>
  35. </body>
  36. </html>
复制代码

  • 在React中的使用示例

    • 创建一个React组件来从后端获取图片并显示。
    • 假设你已经设置好React开发环境(比方使用 create-react-app)。

  1. import React, { useEffect, useState } from'react';
  2. function ImageComponent() {
  3.     const [imgUrl, setImgUrl] = useState('');
  4.     const apiUrl = 'your - api - url';// 替换为实际的API地址
  5.     useEffect(() => {
  6.         fetch(apiUrl)
  7.          .then(response => response.arrayBuffer())
  8.          .then(buffer => {
  9.                 const blob = new Blob([buffer], { type: 'image/png' });
  10.                 setImgUrl(window.URL.createObjectURL(blob));
  11.             })
  12.          .catch(error => {
  13.                 console.error('Error fetching data:', error);
  14.             });
  15.     }, []);
  16.     return <img src={imgUrl} alt="Loaded Image" />;
  17. }
  18. export default ImageComponent;
复制代码
在上述示例中,your - api - url 都需要更换为实际返回图片数据的后端API地点。在实际应用中,你可能需要处置惩罚不同的图片格式(如 image/jpeg 等),并且根据详细情况调整 Blob 的 type 参数。同时,要注意处置惩罚可能出现的跨域题目,后端可能需要设置得当的CORS(跨域资源共享)头。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

铁佛

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表