React-Native中关于图片问题知识总结

系列文章目录

  1. React-Native环境搭建(IOS)
  2. React-Native项目 — 关于IOS知识储备
  3. React-Native项目工程搭建(开发模板搭建)
  4. React-Native项目矢量图标库(react-native-vector-icons)
  5. React-Native项目 — 自定义字体的使用

目录

  • 系列文章目录
  • 前言
  • 一、图片选取
  • 二、图片上传
  • 三、图片压缩、水印、鉴黄等能力
  • 四、图片拖拽和照片排序编辑
  • 总结

前言

任何一个App,几乎都绕不过去一个话题,那就是图片。

图片的技术问题,几乎涵盖整个App的大部分业务场景,这些场景包括:信息流中的帖子浏览、内容发布携带图片的场景、个人头像上传和裁剪、甚至某些照片墙排序编辑的场景等等。

如果归纳总结,RN中关于图片的技术其实无非就是这么几个:图片选取、图片裁剪、图片上传、图片的压缩、拖拽以及编辑排序等能力。

一、图片选取

在RN中,选取图片有专门的第三方库,最常用的有两个,分别是:react-native-image-picker、
react-native-image-crop-picker。

这两者的区别在于,后者能够提供额外的图片裁剪能力。

示例代码如下:

import {launchCamera, launchImageLibrary} from 'react-native-image-picker';

// 选取图片
launchImageLibrary({mediaType: 'photo', selectionLimit: 18}).then(res => {
	if (!res.didCancel) {
          console.log(res.assets);
          // 其中,assets,就是选取的本地图片资源。可以惊醒基本的图片展示。
    }
})

大多数的业务场景,我们用这样的库,就够了。但是,通常情况下,我们的业务中,对于开发者的要求,不仅仅在于实现功能,它也要求我们必须具备良好的UI视觉体验。是的,这两个库,并没有给我们提供那种良好的视觉交互。

所以,图片选取能力,在正常的业务开发中,一般是由native提供图片选择的组件。(这一部分,只能借助ios/android开发人员协助)

二、图片上传

RN的图片上传并没有什么特别之处。

所谓的图片上传,也就是把本地的图片,上传到服务端进行处理的一种过程。

但是,正常的业务,也许并不像我们想象的那么简单。

1、图片资源,一般不会存储到数据库中,它一般以静态资源的方式,存储在云端的文件服务器中,而且,这种存储文件的服务器,和数据库服务完全是分开的。(一般而言,会使用阿里云/腾讯云的资源存储服务)

2、图片的上传,是否一定要经过服务端?我认为也是一个值得思考的问题。图片这种资源,上传对于服务器的压力是比较大的。很多情况下,是客户端直接对接云端的文件上传能力。

在我们正式的业务中,我们一般是,拿着某某云的客户端sdk,获取密钥,进行图片文件的上传。

这个时候,从技术的角度来思考,这些云,支持的客户端sdk,到底包不包含RN的sdk。因为RN的运行环境,和普通的web网页,小程序,是完全不同的。

如果没有相关支持的sdk,那么我们会为它的实现,要付出比较大的代价。

三、图片压缩、水印、鉴黄等能力

其实无论是图片压缩、水印、还是图片鉴黄等能力,我们用程序都是可以实现的。

比如图片的压缩,它会有基于canvas的绘图压缩,有基于图片的像素点能力压缩,有基于图片格式的压缩,但是,在正常的业务中,想要有一个完美的算法,保证自己的压缩能力,质量都是最优,这个就很难了。

图片水印、鉴黄,也是这样的逻辑,代码是可以实现,可是算法是否是最优,效果是否是最好,我们短时间内,几乎无法控制。

一般而言,我们使用哪一家的文件存储服务,就会使用这家服务商的这些能力。我们的开发就变成了,付费,进行少量的代码改造或者服务器配置,就能得到想要的结果。

四、图片拖拽和照片排序编辑

首先,RN是支持基本的拖拽能力的。

单张图片的拖拽,相对而言,在业务中,也比较好实现。PanResponder相关的Api,就是为这个目标而服务的。

但是,如果我们的需求,变成了对各种图片的拖拽排序,就是一个比较复杂的需求了,如果图片的大小,都无法一致,那这个需求就变的更难了。

这个时候的难点不在于,拖拽本身,二是在于复杂的页面视图边距,以及滑动距离的计算等等。

在我们的真实项目实践中,我们使用了 react-native-drag-sort,这个拖拽排序库,进行了业务实践。

总结

RN作为App开发的一种选项,其成熟度已经很高了。

图片作为一款App开发,必不可少的一部分内容,RN几乎都做了比较完备的支持。

当然,任何项目,对于图片的诉求几乎都是一致的,面临的问题也都是一致的。只是面对不同的技术,我们选用的工具,代码,稍微有些差别罢了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/782634.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

java核心-泛型

目录 概述什么是泛型分类泛型类泛型接口泛型方法 泛型通配符分类 泛型类型擦除分类无限制类型擦除有限制类型擦除 问题需求第一种第二种 概述 了解泛型有利于学习 jdk 、中间件的源码,提升代码抽象能力,封装通用性更强的组件。 什么是泛型 在定义类、接…

存储过程编程-创建(CREATE PROCEDURE)、执行(EXEC)、删除(DROP PROCEDURE)

一、定义 1、存储过程是在SQL服务器上存储的已经编译过的SQL语句组。 2、存储过程分为三类:系统提供的存储过程、用户定义的存储过程和扩展存储过程 (1)系统提供的存储过程:在安装SQL Server时,系统创建了很多系统存…

Kafka(一)基础介绍

一,Kafka集群 一个典型的 Kafka 体系架构包括若Producer、Broker、Consumer,以及一个ZooKeeper集群,如图所示。 ZooKeeper:Kafka负责集群元数据的管理、控制器的选举等操作的; Producer:将消息发送到Broker…

MySQL事务隔离

MySQL事务隔离 前言锁共享锁(Shared Lock)排他锁(Exclusive Lock)行级锁(Row-Level Lock)表级锁(Table-Level Lock)快照读和当前读查看锁 事务事务的四个特性事务的并发问题事务的隔…

Chrome 127内置AI大模型攻略

Chrome 127 集成Gemini:本地AI功能 Google将Gemini大模型整合进Chrome浏览器,带来全新免费的本地AI体验: 完全免费、无限制使用支持离线运行,摆脱网络依赖功能涵盖图像识别、自然语言处理、智能推荐等中国大陆需要借助魔法,懂都懂。 安装部署步骤: 1. Chrome V127 dev …

golang验证Etherscan上的智能合约

文章目录 golang验证Etherscan上的智能合约为什么要验证智能合约如何使用golang去验证合约获取EtherscanAPI密钥Verify Source Code接口Check Source Code Verification Status接口演示示例及注意事项网络问题无法调用Etherscan接口(最重要的步骤) golan…

YoloV9改进策略:Block改进|轻量实时的重参数结构|最新改进|即插即用(全网首发)

摘要 本文使用重参数的Block替换YoloV9中的RepNBottleneck,GFLOPs从239降到了227;同时,map50从0.989涨到了0.99(重参数后的结果)。 改进方法简单,只做简单的替换就行,即插即用,非常…

保健品商城小程序模板源码

保健品商城小程序模板源码 简洁通用的保健品,健康生活,零售商品,电子商务微信小程序前端模板下载。包含:主页、购物车、客服、个人中心、我的订单、商品详情、我的钱包、设置等等。 保健品商城小程序模板源码

程序员如何做好需求判断?

1. 导语 本文作为2024上半年核心思考之二。 通过他人经验传导、个人实践、广泛阅读书籍(方法论类、企业经营类、传记类、财务类,具体书单附文末),学会基于更高阶的经营者视角来做好业务需求判断。本文思路如下: 首先,抛一个灵魂问…

【server】springboot 整合 redis

1、redis 使用模式 1.1 单机模式 1.1.1 编译安装方式 1.1.1.1 下载 Redis的安装非常简单,到Redis的官网(Downloads - Redis),下载对应的版本,简单几个命令安装即可。 1.1.1.2 编译安装 tar xzf redis-stable.tar.…

IDEA 开发工具

IDEA 开发工具 IDEA软件激活新建项目新建project 运行调试 IDEA软件激活 访问激活码网进入带*的域名下载并解压左上角的zip包先执行sh uninstall.sh,再执行sh install.sh在带*的网页中复制并使用激活码code 新建项目 新建project file》New〉Project》New Proje…

【测试】系统压力测试报告模板(Word原件)

系统压力测试,简而言之,是在模拟高负载、高并发的环境下,对系统进行全面测试的过程。它旨在评估系统在面对极端使用条件时的性能表现,包括处理能力、响应时间、资源消耗及稳定性等关键指标。通过压力测试,开发团队能够…

MySQL之备份与恢复和MySQL用户工具(一)

备份与恢复 备份脚本化 为备份写一些脚本是标准做法。展示一个示例程序,其中必定有很多辅助内容,这只会增加篇幅,在这里我们更愿意列举一些典型的备份脚本功能,展示一些Perl脚本的代码片段。你可以把这些当作可重用的代码块&…

Python酷库之旅-第三方库Pandas(009)

目录 一、用法精讲 19、pandas.read_xml函数 19-1、语法 19-2、参数 19-3、功能 19-4、返回值 19-5、说明 19-6、用法 19-6-1、数据准备 19-6-2、代码示例 19-6-3、结果输出 20、pandas.DataFrame.to_xml函数 20-1、语法 20-2、参数 20-3、功能 20-4、返回值 …

【国产开源可视化引擎Meta2d.js】网格

画布背景网格 在线体验: 乐吾乐2D可视化 示例: // 设置默认缺省网格属性 meta2d.store.options.grid true; // 开启 meta2d.store.options.gridColor eeeeee; // 网格线条颜色 meta2d.store.options.gridSize 10; // 格子大小// 设置单个图纸的网格…

Golang | Leetcode Golang题解之第222题完全二叉树的节点个数

题目&#xff1a; 题解&#xff1a; func countNodes(root *TreeNode) int {if root nil {return 0}level : 0for node : root; node.Left ! nil; node node.Left {level}return sort.Search(1<<(level1), func(k int) bool {if k < 1<<level {return false}…

【ETABS】【RHINO】案例:Swallow to ETABS

文章目录 01. Swallow Overview总览1 LOAD&#xff1a;Defination of LoadCase、Response Combo2 SectionArea Section and Area Load&#xff08;面截面定义与指定&#xff0c;面荷载指定&#xff09;Frame Section with rebarattr and linear load&#xff08;带钢筋属性框架…

flutter:监听路由的变化

问题 当从路由B页面返回路由A页面后&#xff0c;A页面需要进行数据刷新。因此需要监听路由变化 解决 使用RouteObserver进行录音监听 创建全局变量&#xff0c;不在任何类中 final RouteObserver<PageRoute> routeObserver RouteObserver<PageRoute>();在mai…

Hi3861 OpenHarmony嵌入式应用入门--UDP Server

本篇使用的是lwip编写udp服务端。需要提前准备好一个PARAM_HOTSPOT_SSID宏定义的热点&#xff0c;并且密码为PARAM_HOTSPOT_PSK。 修改网络参数 在Hi3861开发板上运行上述四个测试程序之前&#xff0c;需要根据你的无线路由、Linux系统IP修改 net_params.h文件的相关代码&…

基于轨迹信息的图像近距离可行驶区域方案验证

一 图像可行驶区域方案 1.1 标定场景 1.2 标定步骤 设计一定间距标定场&#xff0c;在标定场固定位置设置摄像头标定标识点。主车开到标定场固定位置录制主车在该位置各个摄像头数据&#xff0c;通过摄像头捕获图像获取图像上关键点坐标pts-2d基于标定场设计&#xff0c;计算…