React-Native开发鸿蒙NEXT-蓝牙与图片处理的更正补充
.markdown-body h1, .markdown-body h2, .markdown-body h3, .markdown-body h4, .markdown-body h5, .markdown-body h6 { line-height: 1.5; margin-top: 35px; margin-bottom: 10px; padding-bottom: 5px }
.markdown-body h1 { font-size: 24px; line-height: 38px; margin-bottom: 5px }
.markdown-body h2 { font-size: 22px; line-height: 34px; padding-bottom: 12px; border-bottom: 1px solid rgba(236, 236, 236, 1) }
.markdown-body h3 { font-size: 20px; line-height: 28px }
.markdown-body h4 { font-size: 18px; line-height: 26px }
.markdown-body h5 { font-size: 17px; line-height: 24px }
.markdown-body h6 { font-size: 16px; line-height: 24px }
.markdown-body p { line-height: inherit; margin-top: 22px; margin-bottom: 22px }
.markdown-body img { max-width: 100% }
.markdown-body hr { border-top: 1px solid rgba(221, 221, 221, 1); border-right: none; border-bottom: none; border-left: none; margin-top: 32px; margin-bottom: 32px }
.markdown-body code { border-radius: 2px; overflow-x: auto; background-color: rgba(255, 245, 245, 1); color: rgba(255, 80, 44, 1); font-size: 0.87em; padding: 0.065em 0.4em }
.markdown-body code, .markdown-body pre { font-family: Menlo, Monaco, Consolas, Courier New, monospace }
.markdown-body pre { overflow: auto; position: relative; line-height: 1.75 }
.markdown-body pre>code { font-size: 12px; padding: 15px 12px; margin: 0; word-break: normal; display: block; overflow-x: auto; color: rgba(51, 51, 51, 1); background: rgba(248, 248, 248, 1) }
.markdown-body a { text-decoration: none; color: rgba(2, 105, 200, 1); border-bottom: 1px solid rgba(209, 233, 255, 1) }
.markdown-body a:active, .markdown-body a:hover { color: rgba(39, 91, 140, 1) }
.markdown-body table { display: inline-block !important; font-size: 12px; width: auto; max-width: 100%; overflow: auto; border: 1px solid rgba(246, 246, 246, 1) }
.markdown-body thead { background: rgba(246, 246, 246, 1); color: rgba(0, 0, 0, 1); text-align: left }
.markdown-body tr:nth-child(2n) { background-color: rgba(252, 252, 252, 1) }
.markdown-body td, .markdown-body th { padding: 12px 7px; line-height: 24px }
.markdown-body td { min-width: 120px }
.markdown-body blockquote { color: rgba(102, 102, 102, 1); padding: 1px 23px; margin: 22px 0; border-left: 4px solid rgba(203, 203, 203, 1); background-color: rgba(248, 248, 248, 1) }
.markdown-body blockquote:after { display: block; content: "" }
.markdown-body blockquote>p { margin: 10px 0 }
.markdown-body ol, .markdown-body ul { padding-left: 28px }
.markdown-body ol li, .markdown-body ul li { margin-bottom: 0; list-style: inherit }
.markdown-body ol li .task-list-item, .markdown-body ul li .task-list-item { list-style: none }
.markdown-body ol li .task-list-item ol, .markdown-body ol li .task-list-item ul, .markdown-body ul li .task-list-item ol, .markdown-body ul li .task-list-item ul { margin-top: 0 }
.markdown-body ol ol, .markdown-body ol ul, .markdown-body ul ol, .markdown-body ul ul { margin-top: 3px }
.markdown-body ol li { padding-left: 6px }
.markdown-body .contains-task-list { padding-left: 0 }
.markdown-body .task-list-item { list-style: none }
@media (max-width: 720px) { .markdown-body h1 { font-size: 24px } .markdown-body h2 { font-size: 20px } .markdown-body h3 { font-size: 18px } }.markdown-body pre, .markdown-body pre>code.hljs { color: rgba(51, 51, 51, 1); background: rgba(248, 248, 248, 1) }
.hljs-comment, .hljs-quote { color: rgba(153, 153, 136, 1); font-style: italic }
.hljs-keyword, .hljs-selector-tag, .hljs-subst { color: rgba(51, 51, 51, 1); font-weight: 700 }
.hljs-literal, .hljs-number, .hljs-tag .hljs-attr, .hljs-template-variable, .hljs-variable { color: rgba(0, 128, 128, 1) }
.hljs-doctag, .hljs-string { color: rgba(221, 17, 68, 1) }
.hljs-section, .hljs-selector-id, .hljs-title { color: rgba(153, 0, 0, 1); font-weight: 700 }
.hljs-subst { font-weight: 400 }
.hljs-class .hljs-title, .hljs-type { color: rgba(68, 85, 136, 1); font-weight: 700 }
.hljs-attribute, .hljs-name, .hljs-tag { color: rgba(0, 0, 128, 1); font-weight: 400 }
.hljs-link, .hljs-regexp { color: rgba(0, 153, 38, 1) }
.hljs-bullet, .hljs-symbol { color: rgba(153, 0, 115, 1) }
.hljs-built_in, .hljs-builtin-name { color: rgba(0, 134, 179, 1) }
.hljs-meta { color: rgba(153, 153, 153, 1); font-weight: 700 }
.hljs-deletion { background: rgba(255, 221, 221, 1) }
.hljs-addition { background: rgba(221, 255, 221, 1) }
.hljs-emphasis { font-style: italic }
.hljs-strong { font-weight: 700 }
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 |
更多内容可关注
我的公众号悬空八只脚
React-Native开发鸿蒙NEXT-蓝牙与图片处理的更正补充的更多相关文章
- React Native开发技术周报1
(一).资讯 1.React Native 0.21版本发布,最新版本功能特点,修复的Bug可以看一下已翻译 重要:如果升级 Android 项目到这个版本一定要读! 我们简化了 Android 应用 ...
- [RN] React Native 使用开源库 react-native-image-crop-picker 实现图片选择、图片剪裁
React Native 使用开源库 react-native-image-crop-picker 实现图片选择.图片剪裁 该库可以实现启动本地相册和照相机来采集图片,并且提供多选.图片裁剪等功能,支 ...
- React Native开发入门
目录: 一.前言 二.什么是React Native 三.开发环境搭建 四.预备知识 五.最简单的React Native小程序 六.总结 七.参考资料 一.前言 虽然只是简单的了解了一下Reac ...
- React Native开发技术周报2
(1).资讯 1.React Native 0.22_rc版本发布 添加了热自动重载功能 (2).技术文章 1.用 React Native 设计的第一个 iOS 应用 我们想为用户设计一款移动端的应 ...
- DECO 一个REACT NAtive 开发IDE工具
DECO 一个REACT NAtive 开发IDE工具. 目前只支持 OS,NO WINDOWS https://www.decosoftware.com/ 一个方便的快速 ERXPRESS 教程:h ...
- React Native 开发之 (02) 用Sublime 3作为React Native的开发IDE
Sublime Text是一个代码编辑器.也是HTML和散文先进的文本编辑器.漂亮的用户界面和非凡的功能,例如:迷你地图,多选择Python插件,代码段等等.完全可自定义键绑定,菜单和工具栏等等.漂亮 ...
- React Native 开发笔记
ReactNativeDemo 学习ReactNative开发,搭建ReactNative第一个项目 React Native 开发笔记 1.安装Homebrew $ /usr/bin/ruby -e ...
- 【转】【React Native开发】
[React Native开发]React Native控件之ListView组件讲解以及最齐全实例(19) [React Native开发]React Native控件之Touchable*系列组 ...
- React Native开发的通讯录应用
React Native开发的通讯录应用(使用JavaScript开发原生iOS应用,vczero) 0.前言: 项目地址:https://github.com/vczero/React-Native ...
- iOS程序员的React Native开发工具集
本文整理了React Native iOS开发过程中有用的工具.服务.测试.库以及网站等. 工具 你可以选择不同的开发环境:DECO.EXPO或者你可以使用Nuclide+Atom,目前我使用EXPO ...
随机推荐
- stream流中toMap()api和Duplicate key问题
1.指定key-value,value是对象中的某个属性值. Map<Integer,String> userMap = userList.stream().collect(Collect ...
- 导出和导入word样式模板
对于自己配置过之后常用的word样式可以导出作为样式模板, 可以重复使用. 举例说一下哪些是常用的word样式, 例如: (常见的): 中文的内容的样式, 中英文分别设置不同的样式 (比较高级的)多级 ...
- Golang 入门 : 变量
变量 Go语言是静态强类型语言,所以变量是有明确类型的.变量实质上就是在内存中的一小块空间,用来存储特定类型的可变数据.如果没有变量我们的程序只能将数值写死都是静态的数据,无法更改,变量可以让我们进行 ...
- 【SpringCloud】各种组件的更新情况
关于Cloud各种组件的停更/升级/替换 由停更引发的"升级惨案" 停更不停用 被动修复bugs 不再接受合并请求 不再发布新版本 以前 now2020 服务注册中心 Eureka ...
- 关于ASCII码的一些信息(转载自https://blog.csdn.net/na_tion/article/details/50148883)
ASCII码分基本表(128个字符,从00000000到01111111).扩展表(256个字符,从00000000到11111111)和压缩表(64个字符),我们经常用的是128个的基本表,而在一些 ...
- 第10章面向对象编程(高级部分)-cnblog
类变量与类方法 static修饰的成员变量(类变量,静态变量)的特性? 同一个类所有对象共享 类变量是随着类的加载而创建, 所以即使没有创建对象实例也可以访问 ,但是类变量的访问, 必须遵守 相关的访 ...
- CM311-1A魔百和刷armbian或openwrt系统包
系统包下载链接:Openwrt:阿里云盘链接:https://www.aliyundrive.com/s/tEemRbs1TYB已失效下载后请解压!!!!!!!!! Armbian:链接:https: ...
- JAVA基础之多线程二期
一.主线程 public class MainThread { /** * 主线程:指执行main()方法的线程,且该线程是单线程,从上到下执行 * JVM执行main()方法时,JVM会将main( ...
- 你常用哪些工具来分析 JVM 性能?
常用的 JVM 性能分析工具 JVM 性能分析工具主要用于监控.调试和优化 Java 程序的性能,尤其是在垃圾回收.内存泄漏.线程调度等方面.以下是一些常用的 JVM 性能分析工具: 1. jvisu ...
- web自动化的元素定位
一.基础元素定位 1.id定位:根据元素的id定位 By.id("id") webDriver.findElement(By.id("tab-account") ...