因為現(xiàn)在手機屏幕的多樣化崭闲,導致我們的圖片會存在一些拉縮變形的情況项戴,所以這里我針對這塊進行了一個方案的解決,如果大家還有更好的瑟啃,感謝大家分享一下。(特別說明:我這里用的是本地圖片揩尸,網(wǎng)絡(luò)圖片我沒有研究過蛹屿,所以如果您的是網(wǎng)絡(luò)圖用不了,麻煩您自己自行解決哈Q矣堋)
我這里采用的方案是使用原生對圖片進行處理错负,然后同步回傳給uniapp進行展示(異步也可以)坟瓢,這種方案本人親測有效(公司項目已經(jīng)在使用),效果也還是蠻不錯的犹撒,如果需要更高端更有效的折联,大家可以自行研究!
在開始講解方案前识颊,大家可以先去看我之前寫的uniapp和原生交互數(shù)據(jù)文章诚镰,下面是文章地址:
iOS和uniapp數(shù)據(jù)交互:https://blog.csdn.net/yun199466/article/details/106269636
Android和uniapp數(shù)據(jù)交互:https://blog.csdn.net/yun199466/article/details/106269779
我這里使用的同步從原生回傳圖片的,大家也可以用異步回傳圖片祥款,這個看個人需求清笨。
好了,廢話不多說刃跛,開始講解源碼和流程了?侔!奠伪!
一跌帐、需要先獲取到展示圖片容器的寬高(注意:這個寬高是要傳到原生進行使用的,別忘記了)
//獲取素材版本號(這個版本號是為了在后期修改绊率、新增圖片后谨敛,可以重新進行生成而設(shè)定的)
? ? ? ? ? ? let native_image_base_key = "image_V1";
//獲取本地存儲的base64圖片
let localBaseData = uni.getStorageSync(native_image_base_key);
? ? ? ? ? ??//查找圖片容器元素
let that = this;
const query = uni.createSelectorQuery().in(this);
query.select('.你的容器的樣式名稱').boundingClientRect(data => {
let containerW = data.width;//容器的寬
let?containerH = data.height;//容器的高
? ? ? ? ? ? ? ?//保存圖片時的key值,這個看個人怎么定義滤否,注意多個圖片的時候不要設(shè)置一樣的脸狸,防止圖片被覆蓋
? ? ? ? ? ? ? ? let key = "my_img";
//優(yōu)先判斷本地是否存儲過了base64編碼,存儲了就拿本地藐俺,否則傳到原生進行壓縮處理
//同時判斷是否存在指定版本素材的圖片(考慮后期可能會更換圖片)
if (localBaseData != "" && localBaseData != null && localBaseData != undefined &&
localBaseData[key] != null && localBaseData[key] != "" && localBaseData[key] != undefined) {
console.log("取本地的Base64圖片");
var base64Data = localBaseData[key];
} else {
//將圖片傳到原生壓縮到指定寬高后回傳base64回來進行替換展示
let baseImage = NativePlugin.NativeImageSplitter("圖片名或者圖片路徑(這里傳給原生是為了原生項目可以拿到本地圖片)",containerW,containerH);
if (baseImage != null && baseImage != undefined){
if (Array.isArray(baseImage) && baseImage.length > 0) {
//處理iOS端返回的數(shù)據(jù)
that.nativaBaseData[key] = baseImage[0];
//TODO:記得同時更新圖片容器的圖片顯示
} else {
//處理Android返回的數(shù)據(jù)
if (baseImage != "") {
that.nativaBaseData[key] = baseImage;
//TODO:記得同時更新圖片容器的圖片顯示
}
}
}
uni.setStorage({key:native_image_base_key,data:this.nativaBaseData,success() {
console.log("保存本地base64成功");
}});
}).exec();
nativaBaseData : 這是我定義的一個全局對象炊甲,用來存儲Base64編碼圖片的。格式{"my_img":"處理過的base64編碼圖片字符串"}
二欲芹、原生將base64編碼圖片傳到uniapp代碼
(1)iOS端回傳代碼
(2)Android端回傳代碼
注意點:
1卿啡、本地圖片最好是叫美工設(shè)計成有邊緣拉伸效果的;
2菱父、圖片回傳可使用同步颈娜、異步都可以,這個看個人需求而定浙宜,這里我只是才有同步來講解下思路官辽;
三、原生兩端的代碼
(1)iOS端原生代碼
https://download.csdn.net/download/yun199466/16744224
(2)Android端原生代碼