React-Native开发鸿蒙NEXT-蓝牙与图片处理的更正补充
最近应用被鸿蒙测试团队提了几个问题,主要集中在图片上传上面。这几天在修改,过程中对于之前提到的蓝牙和图片上传两块有了点新的认识,记录以供参考。
之前在
React-Native开发鸿蒙NEXT-蓝牙信标读取
悬空八只脚,公众号:悬空八只脚React-Native开发鸿蒙NEXT-蓝牙信标读取
中有提到
这次在修复问题后验证过程中,发现是硬件问题---手上的蓝牙信标电量不行了,换了个新的纽扣电池信号强了就搜得到了。误会,都是误会。。。。。。
蓝牙只是一个小插曲,图片上传的问题,在于上传的图片比例失真。调试后发现是RHON三方组件react-native-image-picker的问题。在
React-Native开发鸿蒙NEXT-图片上传
悬空八只脚,公众号:悬空八只脚React-Native开发鸿蒙NEXT-图片上传
中,提到
这里为了限制图片体积限制了最大宽高,但react-native-image-picker组件在遇到超过maxHeight/maxWeight尺寸的图片时是直接采用fill模式来裁剪的,没有等比缩放。这最终导致了输出图片的失真。
和后台同学沟通了下放开了后台附加上传的大小限制(之前被限制在了1MB),结合上传的等待时间,最终考虑在APP端将上传尺寸限制在2MB。为此在RN端引入了RHON三方组件react-native-image-resizer用于处理图片体积压缩。
目前主要的处理逻辑如下
- 在通过react-native-image-picker选择图片时放开了对图片尺寸的限制
- 选择的图片如果size大于2MB,则交由react-native-image-resizer做压缩处理
- react-native-image-resizer在压缩过程中限制最大宽高尺寸1500
- react-native-image-resizer对图片循环压缩,质量由90开始逐次递减10,如果达到50仍然无法达到小于2MB的目标体积,则停止压缩直接反馈业务报错,保证处理时间与最终效果。
- 每次压缩均针对由react-native-image-picker输出的原图。
- 将压缩后的图片或无需压缩的原图进行上传。
const resizeImage = async (photoInfo: any) => {
try {
let quality = 90;
let uploadUri = '';
if (photoInfo.fileSize <= global.config.maxUploadSize * 1000) {
console.log('图片尺寸未超出限制,直接上传');
uploadUri = photoInfo.uri;
} else {
while (quality >= 50) {
console.log('quality = ' + quality);
let result = await ImageResizer.createResizedImage(
photoInfo.uri,
1500,
1500,
'jpeg',
quality,
0,
undefined,
false,
'contain',
true,
);
// console.log('图片数据是result = ' + JSON.stringify(result.size));
if (!result) {
console.log('压缩失败');
xnToast('图片压缩失败,无法上传');
break;
}
if (result.size / 1000 <= global.config.maxUploadSize) {
console.log('可以上传');
uploadUri = result.uri;
break;
} else {
if (quality > 50) {
quality -= 10;
console.log('重新设定压缩参数');
} else {
console.log('过大无法压缩');
xnToast('图片过大,无法上传');
break;
}
}
}
}
if (uploadUri && uploadUri.length > 0) {
// 这里是上传图片的逻辑
}
} catch (error) {
setLoading(false);
xnToast('图片上传失败');
console.log('Unable to resize the photo ' + JSON.stringify(error.message));
}
};
最近新版本突然被审核的自动化测试折磨得死去活来。上个版本没问题这个版本突然有崩溃,看日志又无法定位复现不了。本来都没关注云测试,现在出问题了去跑,就看见到登录页面然后闪退了。。。。。。毫无头绪。现在只能拿上个版本的app文件去跑测试,如果上个版本真实毫无问题,最差结果可能得暂时在上个版本的代码上去修复问题了,老卡在这块上不是个事。等和技术支持拉扯完再来讲讲到底怎么一回事吧。
附录:@react-native-oh-tpl/react-native-image-resizer压缩效率的测试。
其中压缩前图片是由@react-native-oh-tpl/react-native-qr-decode-image-camera导出的一张mate60pro测试机利用后置摄像头拍摄照片
| 格式 | 尺寸/设置的最大目标尺寸 | 压缩质量 | 大小 | |
|---|---|---|---|---|
| 压缩前 | jpg | 3073x4096 | -- | 4745595 |
| 压缩后 | jpg | 1500x1500 | 80 | 1130380 |
| 压缩后 | jpg | 1500x1500 | 70 | 875938 |
| 压缩后 | png | 1500x1500 | 80 | 3101374 |
| 压缩后 | webp | 1500x1500 | 80 | 629054 |
更多内容可关注
我的公众号悬空八只脚