前端加載超大圖片實現秒開解決方案

轉自:vjmap

https://juejin.cn/post/7212270321622106170

前言

前端加載超大圖片時,一般可以採取以下措施實現加速:

  1. 圖片壓縮:將圖片進行壓縮可以大幅減小圖片的大小,從而縮短加載時間。壓縮圖片時需要注意保持圖片質量,以免影響圖片顯示效果。

  2. 圖片分割:將超大圖片分割成多個小圖塊進行加載,可以避免一次性加載整個圖片,從而加快加載速度。這種方式需要在前端實現圖片拼接,需要確保拼接後的圖片無縫銜接。

  3. CDN 加速:使用 CDN(內容分發網絡)可以將圖片緩存在離用戶更近的節點上,從而加速圖片加載速度。如果需要加載的圖片是靜態資源,可以將其存儲在 CDN 上,以便快速訪問。

  4. 懶加載:懶加載是一種圖片延遲加載的方式,即當用戶瀏覽到需要加載的圖片時才進行加載,可以有效避免一次性加載大量圖片而導致頁面加載速度緩慢。

  5. WebP 格式:使用 WebP 格式可以將圖片大小減小到 JPEG 和 PNG 的一半以下,從而加快圖片加載速度。

  6. HTTP/2:使用 HTTP/2 協議可以並行加載多個圖片,從而加快頁面加載速度。

  7. 預加載:預加載是在頁面加載完畢後,提前加載下一步所需要的資源。在圖片加載方面,可以在頁面加載完畢後提前加載下一個需要顯示的圖片,以便用戶快速瀏覽。

而對於幾百 M 或上 G 的大圖而言,不管對圖片進行怎麼優化或加速處理,要實現秒開也是不太可能的事情。而上面介紹的第二條 “圖像分割切片” 是最佳解決方案。下面介紹下如何對大圖進行分割,在前端進行拼接實現秒開。

圖像切片原理介紹

圖像切片是指將一張大圖分割成若干個小圖的過程,以便於存儲和處理。圖像切片常用於網絡地圖、瓦片地圖、圖像拼接等應用中。

切片原理主要包括以下幾個步驟:

  1. 定義切片大小:首先需要定義每個小圖的大小,一般情況下是正方形或矩形。

  2. 計算切片數量:根據定義的切片大小,計算原始圖像需要被切成多少個小圖。計算公式爲:切片數量 = 原始圖像寬度 / 切片寬度 × 原始圖像高度 / 切片高度。

  3. 切割圖像:按照計算出的切片數量,將原始圖像分割成相應數量的小圖。可以使用圖像處理庫或自己編寫代碼實現。

  4. 存儲切片:將切割後的小圖存儲到磁盤上,可以使用常見的圖片格式,如 JPEG、PNG 等。

  5. 加載切片:在需要顯示切片的地方,根據需要加載相應的小圖,組合成完整的圖像。

使用圖像切片可以降低處理大圖像的複雜度,同時也能夠提高圖像的加載速度,使得用戶可以更快地查看圖像的細節。圖像切片廣泛應用於需要處理大圖像的場景,能夠提高圖像處理和顯示效率,同時也能夠提高用戶的體驗。

實現

先上效果圖

上傳打開圖形

先上傳大圖,至後臺進行切片處理, 上傳相關代碼爲:

async onChangeFile(file) {
            try {
                message.info('文件上傳中,請稍候...')
                this.isSelectFile = false;
                this.uploadMapResult = await svc.uploadMap(file.raw);
                if (this.uploadMapResult.error) {
                    message.error('上傳圖形失敗!' + this.uploadMapResult.error)
                    return
                }
                this.form.mapid = this.uploadMapResult.mapid;
                this.form.uploadname = this.uploadMapResult.uploadname;
                this.maptype = this.uploadMapResult.maptype || '';
                this.dialogVisible = true;
            } catch (error) {
                console.error(error);
                message.error('上傳圖形失敗!', error)
            }
        }

如果需要上傳後對圖像進行處理,可以新建一個 cmd.txt 文件,把處理的命令寫進文件中,然後和圖像一起打包成 zip 上傳。

如需要把 1.jpg,2.jpg 拼接成一個新的圖片 m1.png 再打開, cmd.txt 的寫法如下:

join
1.jpg
2.jpg
m1.png
horizontal

再把 1.jpg,2.jpg,cmd.txt 三個文件打包成 zip 文件上傳即可

打開圖像相關代碼

async onOpenMap() {
            try {
                let mapid = this.form.mapid;
                let param = {
                    ...this.uploadMapResult,
                    // 圖名稱
                    mapid: this.form.mapid,
                    // 上傳完返回的fileid
                    fileid: this.uploadMapResult.fileid,
                    // 上傳完返回的文件名
                    uploadname: this.form.uploadname,
                    // 地圖打開方式
                    mapopenway: this.form.openway === "直接打開圖形" ? vjmap.MapOpenWay.Memory : vjmap.MapOpenWay.GeomRender,
                    // 如果要密碼訪問的話,設置祕鑰值
                    secretKey: this.form.isPasswordProtection ? svc.pwdToSecretKey(this.form.password) : undefined,
                    style: vjmap.openMapDarkStyle(),// div爲深色背景顏色時,這裏也傳深色背景樣式
                    // 圖像類型設置地圖左上角座標和分辨率
                    imageLeft: this.form.imageLeft ? +this.form.imageLeft : undefined,
                    imageTop: this.form.imageTop ? +this.form.imageTop : undefined,
                    imageResolution: this.form.imageResolution ? +this.form.imageResolution : undefined,
                }
                let isVectorStyle = this.form.openway === "存儲後渲染矢量";
                await openMap(param, isVectorStyle);
            } catch (error) {
                console.error(error);
                message.error('打開圖形失敗!', error)
            }
        }

應用案例

應用一 對圖像進行拼接前端查看

原始圖片爲

最終效果爲:

體驗地址:https://vjmap.com/app/cloud/#/map/t3c93d14ff09?version=v1&mapopenway=GeomRender&vector=false

應用二 對 tiff 影像進行切片並與 CAD 圖疊加校準

對 tiff 影像上傳時可設置地理座標範圍。

tiff/tfw, jpg/jpgw 座標文件的格式 (6 個參數) 0.030000 0.0000000000 0.0000000000 -0.030000 451510.875000 3358045.000000

以上每行對應的含義:

1 地圖單元中的一個象素在 X 方向上的 X 分辨率尺度。2 平移量。3 旋轉量。4 地圖單元中的一個象素在 Y 方向上的 Y 分辨率尺度的負值。5 象素 1,1(左上方)的 X 地座標。6 象素 1,1(左上方)的 Y 地座標。

在上傳圖時需要根據文件中的第一個,第五個和第六個值設置地圖範圍

或者上傳完後,操作菜單中點擊設置地圖範圍進行設置

影像地圖切片完成後,可與 CAD 圖進行疊加校準。效果如下

體驗地址: https://vjmap.com/demo/#/demo/map/comprehensive/04imagecadmap

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/YBhyk4e25VhrRgiCbNUruA