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

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

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

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

(在控制臺(tái)看的)返回的是這個(gè)圖片(二進(jìn)制)

可是,在 打印的時(shí)候,返回的卻是

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

找到了原因,解決方案就好辦了。我們?cè)?axios 里面,responseType 默認(rèn)返回?cái)?shù)據(jù)類型是 json,將其改為返回?cái)?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 策略,會(huì)存在跨域問題https://stackoverflow.com/questions/20424279/canvas-todataurl-securityerror
        image.setAttribute("crossOrigin",'Anonymous');
        image.src = url;
        // 圖片加載失敗的錯(cuò)誤處理
        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對(duì)象創(chuàng)建臨時(shí)的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 位無符號(hào)整數(shù)值的類型化數(shù)組。內(nèi)容將初始化為 0。
      // 如果無法分配請(qǐng)求數(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對(duì)象
  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:如果圖片較大,圖片的色彩層次比較豐富,則不適合使用這種方式,因?yàn)槠銪ase64編碼后的字符串非常大,會(huì)明顯增大HTML頁(yè)面,影響加載速度。 如果圖片像loading或者表格線這樣的,大小極小,但又占據(jù)了一次HTTP請(qǐng)求,而很多地方都會(huì)使用。則非常適用“base64:URL圖片”技術(shù)進(jìn)行優(yōu)化了!。

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

總結(jié)

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

相關(guān)文章

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

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

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

    Spring高級(jí)接口Aware淺析

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

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

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

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

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

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

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

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

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

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

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

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

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

    java實(shí)現(xiàn)網(wǎng)上購(gòu)物車程序

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

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

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

最新評(píng)論

淅川县| 三门峡市| 女性| 深州市| 河东区| 岐山县| 古交市| 卓资县| 屏南县| 洞头县| 宁明县| 蒙阴县| 衡阳县| 汪清县| 乐清市| 昌邑市| 肇东市| 林西县| 新营市| 泸西县| 昆山市| 贡觉县| 金坛市| 翁源县| 聊城市| 子长县| 哈巴河县| 新源县| 德州市| 额济纳旗| 阿拉尔市| 罗江县| 奉贤区| 利辛县| 镇宁| 醴陵市| 论坛| 怀化市| 安阳县| 宁都县| 辉县市|