這里給大家分享我在網上總結出來的一些知識,希望對大家有所幫助
前言
前端加載超大圖片時,一般可以采取以下措施實作加速:
- 圖片壓縮:將圖片進行壓縮可以大幅減小圖片的大小,從而縮短加載時間,壓縮圖片時需要注意保持圖片質量,以免影響圖片顯示效果,
- 圖片分割:將超大圖片分割成多個小圖塊進行加載,可以避免一次性加載整個圖片,從而加快加載速度,這種方式需要在前端實作圖片拼接,需要確保拼接后的圖片無縫銜接,
- CDN 加速:使用 CDN(內容分發網路)可以將圖片快取在離用戶更近的節點上,從而加速圖片加載速度,如果需要加載的圖片是靜態資源,可以將其存盤在 CDN 上,以便快速訪問,
- 懶加載:懶加載是一種圖片延遲加載的方式,即當用戶瀏覽到需要加載的圖片時才進行加載,可以有效避免一次性加載大量圖片而導致頁面加載速度緩慢,
- WebP 格式:使用 WebP 格式可以將圖片大小減小到 JPEG 和 PNG 的一半以下,從而加快圖片加載速度,
- HTTP/2:使用 HTTP/2 協議可以并行加載多個圖片,從而加快頁面加載速度,
- 預加載:預加載是在頁面加載完畢后,提前加載下一步所需要的資源,在圖片加載方面,可以在頁面加載完畢后提前加載下一個需要顯示的圖片,以便用戶快速瀏覽,
而對于幾百M或上G的大圖而言,不管對圖片進行怎么優化或加速處理,要實作秒開也是不太可能的事情,而上面介紹的第二條“影像分割切片”是最佳解決方案,下面介紹下如何對大圖進行分割,在前端進行拼接實作秒開,
影像切片原理介紹
影像切片是指將一張大圖分割成若干個小圖的程序,以便于存盤和處理,影像切片常用于網路地圖、瓦片地圖、影像拼接等應用中,
切片原理主要包括以下幾個步驟:
- 定義切片大小:首先需要定義每個小圖的大小,一般情況下是正方形或矩形,
- 計算切片數量:根據定義的切片大小,計算原始影像需要被切成多少個小圖,計算公式為:切片數量 = 原始影像寬度 / 切片寬度 × 原始影像高度 / 切片高度,
- 切割影像:按照計算出的切片數量,將原始影像分割成相應數量的小圖,可以使用影像處理庫或自己撰寫代碼實作,
- 存盤切片:將切割后的小圖存盤到磁盤上,可以使用常見的圖片格式,如JPEG、PNG等,
- 加載切片:在需要顯示切片的地方,根據需要加載相應的小圖,組合成完整的影像,
使用影像切片可以降低處理大影像的復雜度,同時也能夠提高影像的加載速度,使得用戶可以更快地查看影像的細節,影像切片廣泛應用于需要處理大影像的場景,能夠提高影像處理和顯示效率,同時也能夠提高用戶的體驗,
實作
先上效果圖

上傳打開圖形
先上傳大圖,至后臺進行切片處理, 上傳相關代碼為:
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)
}
}
應用案例
應用一 對影像進行拼接前端查看
原始圖片為


最終效果為:

體驗地址: vjmap.com/app/cloud/#…
應用二 對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圖進行疊加校準,效果如下

體驗地址: vjmap.com/demo/#/demo…
本文轉載于:
https://juejin.cn/post/7212270321622106170
如果對您有所幫助,歡迎您點個關注,我會定時更新技術檔案,大家一起討論學習,一起進步,

轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/547694.html
標籤:其他

