最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

后端返回各種圖片形式在前端的轉(zhuǎn)換及展示方法對比

 更新時間:2023年06月13日 09:43:30   作者:鯨洛洛  
這篇文章主要給大家介紹了關(guān)于后端返回各種圖片形式在前端的轉(zhuǎn)換及展示方法對比的相關(guān)資料,文中通過圖文介紹的非常詳細,對大家的學(xué)習或者工作具有一定的參考學(xué)習價值,需要的朋友可以參考下

一、接口返回的圖片顯示如下所示:

(在控制臺看的)返回的是這個圖片(二進制)

可是,在 打印的時候,返回的卻是

出現(xiàn)問題的原因的axios 默認返回的是 json 文本形式,二進制圖片數(shù)據(jù)被強制轉(zhuǎn)換成了 json 文本形式。

找到了原因,解決方案就好辦了。我們在 axios 里面,responseType 默認返回數(shù)據(jù)類型是 json,將其改為返回數(shù)據(jù)類型 blob。下面代碼是正常的圖片顯示,若是接口返回的圖片要回顯到 van-uploader里面,參考 van-uplaoder保存文件到后端,回顯后端接口返回的數(shù)據(jù)

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,三者之間轉(zhuǎn)化

1.url 轉(zhuǎn) base64

原理: 利用canvas.toDataURL的API轉(zhuǎn)化成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'));
      };
    }

調(diào)用

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

2.base64 轉(zhuǎn) blob

原理:利用URL.createObjectURL為blob對象創(chuàng)建臨時的URL

function base64ToBlob ({b64data = '', contentType = '', sliceSize = 512} = {}) {
  return new Promise((resolve, reject) => {
    // 使用 atob() 方法將數(shù)據(jù)解碼
    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 位無符號整數(shù)值的類型化數(shù)組。內(nèi)容將初始化為 0。
      // 如果無法分配請求數(shù)目的字節(jié),則將引發(fā)異常。
      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)
  })
 }

調(diào)用

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

3.blob 轉(zhuǎn) base64

原理:利用fileReader的readAsDataURL,將blob轉(zhuǎn)為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'));
    };
  });
}

調(diào)用

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

三、三種顯示方式,哪種更優(yōu)雅呢?

url: 一般來說,圖片的顯示還是建議使用url的方式比較好。如果后端傳過來的字段是圖片路徑的話。

base64:如果圖片較大,圖片的色彩層次比較豐富,則不適合使用這種方式,因為其Base64編碼后的字符串非常大,會明顯增大HTML頁面,影響加載速度。 如果圖片像loading或者表格線這樣的,大小極小,但又占據(jù)了一次HTTP請求,而很多地方都會使用。則非常適用“base64:URL圖片”技術(shù)進行優(yōu)化了!。

blob: 當后端返回特定的圖片二進制流的時候,就像我第一part里的情景再現(xiàn)說的,前端用blob容器接收。圖片用blob展示會比較好。

總結(jié)

到此這篇關(guān)于后端返回各種圖片形式在前端的轉(zhuǎn)換及展示方法對比的文章就介紹到這了,更多相關(guān)后端返回圖片在前端轉(zhuǎn)換展示內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • spring初始化方法的執(zhí)行順序及其原理分析

    spring初始化方法的執(zhí)行順序及其原理分析

    這篇文章主要介紹了spring初始化方法的執(zhí)行順序及其原理分析,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • Spring高級接口Aware淺析

    Spring高級接口Aware淺析

    通過aware接口可以獲取Spring容器相關(guān)信息,但這樣會與Spring容器耦合,這篇文章主要介紹了Spring aware接口理解,需要的朋友可以參考下
    2023-01-01
  • Jmail發(fā)送郵件工具類分享

    Jmail發(fā)送郵件工具類分享

    這篇文章主要為大家分享了Jmail發(fā)送郵件工具類,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • Springboot的ThreadPoolTaskScheduler線程池輕松搞定15分鐘不操作自動取消訂單

    Springboot的ThreadPoolTaskScheduler線程池輕松搞定15分鐘不操作自動取消訂單

    這篇文章主要介紹了Springboot的ThreadPoolTaskScheduler線程池輕松搞定15分鐘不操作自動取消訂單,本文給大家介紹的非常詳細,需要的朋友可以參考下
    2025-01-01
  • 詳解自定義SpringMVC的Http信息轉(zhuǎn)換器的使用

    詳解自定義SpringMVC的Http信息轉(zhuǎn)換器的使用

    這篇文章主要介紹了詳解自定義SpringMVC的Http信息轉(zhuǎn)換器的使用,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-11-11
  • 解密Spring?Boot深入理解條件裝配與條件注解

    解密Spring?Boot深入理解條件裝配與條件注解

    條件注解是一種特殊的注解,用于標記在配置類、組件類或方法上,它們根據(jù)某些條件的結(jié)果來決定是否應(yīng)用相應(yīng)的配置或組件,這篇文章主要介紹了解密Spring?Boot深入理解條件裝配與條件注解,需要的朋友可以參考下
    2024-06-06
  • java獲取每月的最后一天實現(xiàn)方法

    java獲取每月的最后一天實現(xiàn)方法

    下面小編就為大家?guī)硪黄猨ava獲取每月的最后一天實現(xiàn)方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-09-09
  • Mybatis中SQL的執(zhí)行過程詳解

    Mybatis中SQL的執(zhí)行過程詳解

    MyBatis框架通過映射文件或注解將Java代碼中的方法與數(shù)據(jù)庫操作進行映射,執(zhí)行過程包括SQL解析、參數(shù)綁定、SQL預(yù)編譯、執(zhí)行、結(jié)果映射、事務(wù)處理、緩存處理和日志記錄
    2024-12-12
  • java實現(xiàn)網(wǎng)上購物車程序

    java實現(xiàn)網(wǎng)上購物車程序

    這篇文章主要介紹了java實現(xiàn)網(wǎng)上購物車程序,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • Java 正則表達式的使用實戰(zhàn)案例

    Java 正則表達式的使用實戰(zhàn)案例

    本文詳細介紹了Java正則表達式的使用方法,涵蓋語法細節(jié)、核心類方法、高級特性及實戰(zhàn)案例,本文給大家介紹的非常詳細,對大家的學(xué)習或工作具有一定的參考借鑒價值,需要的朋友跟隨小編一起看看吧
    2025-08-08

最新評論

清苑县| 页游| 云霄县| 旅游| 四会市| 凌海市| 库车县| 嘉义市| 绥芬河市| 芦溪县| 弥渡县| 宝应县| 古丈县| 河池市| 梓潼县| 宜兰县| 车险| 包头市| 荣成市| 翼城县| 大同县| 缙云县| 菏泽市| 巴中市| 河西区| 丰原市| 济源市| 象山县| 双辽市| 阿尔山市| 河间市| 勃利县| 佛冈县| 金乡县| 闵行区| 浦城县| 祁东县| 洛阳市| 定兴县| 铜陵市| 界首市|