后端返回各种图片形式在前端的转换及展示方法对比

 更新时间:2023年06月13日 09:43:30   作者:鲸洛洛  
这篇文章主要给大家介绍了关于后端返回各种图片形式在前端的转换及展示方法对比的相关资料,文中通过图文介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

一、接口返回的图片显示如下所示:

(在控制台看的)返回的是这个图片(二进制)

可是,在 打印的时候,返回的却是

出现问题的原因的axios 默认返回的是 json 文本形式,二进制图片数据被强制转换成了 json 文本形式。

找到了原因,解决方案就好办了。我们在 axios 里面,responseType 默认返回数据类型是 json,将其改为返回数据类型 blob。下面代码是正常的图片显示,若是接口返回的图片要回显到 van-uploader里面,参考 van-uplaoder保存文件到后端,回显后端接口返回的数据

axios({
     method: 'get',
     url: 'XXXXX',
      headers: {
                   'xxx': xxxx,  //需要token的借鉴
            },
       responseType: 'arraybuffer',
})
       .then(res => {                 
             let url=window.URL.createObjectURL(new Blob([res.data], { type: 'image/png' })),
              //直接把url赋值给img的src
       })
        .catch(err => {
               reject(err.data)
          })

二、url、base64、blob,三者之间转化

1.url 转 base64

原理: 利用canvas.toDataURL的API转化成base64

function urlToBase64(url) {
      return new Promise ((resolve,reject) => {
        let image = new Image();
        image.onload = function() {
          let canvas = document.createElement('canvas');
          canvas.width = this.naturalWidth;
          canvas.height = this.naturalHeight;
          // 将图片插入画布并开始绘制
          canvas.getContext('2d').drawImage(image, 0, 0);
          // result
          let result = canvas.toDataURL('image/png')
          resolve(result);
        };
        // CORS 策略,会存在跨域问题https://stackoverflow.com/questions/20424279/canvas-todataurl-securityerror
        image.setAttribute("crossOrigin",'Anonymous');
        image.src = url;
        // 图片加载失败的错误处理
        image.onerror = () => {
          reject(new Error('urlToBase64 error'));
      };
    }

调用

let imgUrL = `http://XXX.jpg`
urlToBase64(imgUrL).then(res => {
  // 转化后的base64图片地址
  console.log('base64', res)
})

2.base64 转 blob

原理:利用URL.createObjectURL为blob对象创建临时的URL

function base64ToBlob ({b64data = '', contentType = '', sliceSize = 512} = {}) {
  return new Promise((resolve, reject) => {
    // 使用 atob() 方法将数据解码
    let byteCharacters = atob(b64data);
    let byteArrays = [];
    for (let offset = 0; offset < byteCharacters.length; offset += sliceSize) {
      let slice = byteCharacters.slice(offset, offset + sliceSize);
      let byteNumbers = [];
      for (let i = 0; i < slice.length; i++) {
          byteNumbers.push(slice.charCodeAt(i));
      }
      // 8 位无符号整数值的类型化数组。内容将初始化为 0。
      // 如果无法分配请求数目的字节,则将引发异常。
      byteArrays.push(new Uint8Array(byteNumbers));
    }
    let result = new Blob(byteArrays, {
      type: contentType
    })
    result = Object.assign(result,{
      // 这里一定要处理一下 URL.createObjectURL
      preview: URL.createObjectURL(result),
      name: `XXX.png`
    });
    resolve(result)
  })
 }

调用

let base64 = base64.split(',')[1]
base64ToBlob({b64data: base64, contentType: 'image/png'}).then(res => {
  // 转后后的blob对象
  console.log('blob', res)
})

3.blob 转 base64

原理:利用fileReader的readAsDataURL,将blob转为base64

blobToBase64(blob) {
  return new Promise((resolve, reject) => {
    const fileReader = new FileReader();
    fileReader.onload = (e) => {
      resolve(e.target.result);
    };
    // readAsDataURL
    fileReader.readAsDataURL(blob);
    fileReader.onerror = () => {
      reject(new Error('blobToBase64 error'));
    };
  });
}

调用

blobToBase64(blob).then(res => {
  // 转化后的base64
  console.log('base64', res)
})

三、三种显示方式,哪种更优雅呢?

url: 一般来说,图片的显示还是建议使用url的方式比较好。如果后端传过来的字段是图片路径的话。

base64:如果图片较大,图片的色彩层次比较丰富,则不适合使用这种方式,因为其Base64编码后的字符串非常大,会明显增大HTML页面,影响加载速度。 如果图片像loading或者表格线这样的,大小极小,但又占据了一次HTTP请求,而很多地方都会使用。则非常适用“base64:URL图片”技术进行优化了!。

blob: 当后端返回特定的图片二进制流的时候,就像我第一part里的情景再现说的,前端用blob容器接收。图片用blob展示会比较好。

总结

到此这篇关于后端返回各种图片形式在前端的转换及展示方法对比的文章就介绍到这了,更多相关后端返回图片在前端转换展示内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java多线程的其他知识_动力节点Java学院整理

    Java多线程的其他知识_动力节点Java学院整理

    这篇文章主要介绍了Java多线程的其他知识,需要的朋友可以参考下
    2017-05-05
  • 关于Java 并发的 CAS

    关于Java 并发的 CAS

    后端开发锁成为一个不可避免的话题,今天我们讨论的是与之对应的无锁 CAS。本文会从怎么来的、是什么、怎么用、原理分析、遇到的问题等不同的角度带你真正搞懂 CAS。
    2021-09-09
  • Java多线程死锁示例

    Java多线程死锁示例

    这篇文章主要介绍了Java多线程死锁,结合实例形式分析了Java多线程出现死锁的相关原因与操作注意事项,需要的朋友可以参考下
    2018-08-08
  • SpringBoot详解整合Spring Boot Admin实现监控功能

    SpringBoot详解整合Spring Boot Admin实现监控功能

    这篇文章主要介绍了SpringBoot整合Spring Boot Admin实现服务监控,内容包括Server端服务开发,Client端服务开发其中Spring Boot Admin还可以对其监控的服务提供告警功能,如服务宕机时,可以及时以邮件方式通知运维人员,感兴趣的朋友跟随小编一起看看吧
    2022-07-07
  • 数据结构与算法之手撕排序算法

    数据结构与算法之手撕排序算法

    排序算法看似简单,其实不同的算法中蕴涵着经典的算法策略。通过熟练掌握排序算法,就可以掌握基本的算法设计思想,本文主要介绍了Java中的排序算法,需要的朋友欢迎阅读
    2023-04-04
  • Java导出oracle表结构实例详解

    Java导出oracle表结构实例详解

    这篇文章主要介绍了 Java导出oracle表结构实例详解的相关资料,需要的朋友可以参考下
    2017-03-03
  • idea中的jvm调优方式

    idea中的jvm调优方式

    这篇文章主要介绍了idea中的jvm调优方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-12-12
  • mybatis注解开发使用foreach方式

    mybatis注解开发使用foreach方式

    这篇文章主要介绍了mybatis注解开发使用foreach方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-08-08
  • spring boot微服务场景下apollo加载过程解析

    spring boot微服务场景下apollo加载过程解析

    apollo 是一个开源的配置中心项目,功能很强大,apollo 本身的配置项并不复杂,但是因为配置的路径特别多,非常容易搞混了, 所以本文试图聚焦 spring-boot 的场景,在 spring-boot 微服务场景下,搞清楚 apollo-client的加载过程
    2022-02-02
  • Springboot工具类FileCopyUtils使用教程

    Springboot工具类FileCopyUtils使用教程

    这篇文章主要介绍了Springboot内置的工具类之FileCopyUtils的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧
    2022-12-12

最新评论