软件开发中对图片的加工处理的一些个人思考和总结

前言:

        最近在公司做项目的时候,有一个业务场景就是同一张图片,在不同的位置上展示的效果是不一致的,其实理解起来也很简单,就以大家熟悉的微信头像而言,我们在正常使用的情况下,一个微信头像的大小假设为80 * 80 格式,而我们在点击头像弹出的头像图片的格式肯定是大于80 * 80的呀,那么,对于这种同一张图片渲染为不同规格的需求,我们一开始是直接将该图片丢给前端,让前端进行加工渲染,但是这就导致一个很可怕的现象:每次页面渲染,前端都要对各个图像都进行一个加工处理,这怎么看都不合理呀!那该怎么搞呢?


疑惑:

        一番冲浪后,我发现了一个针对于图片的处理库——Thumbnailator,可以实现图片的加水印呀,或者说设置指定大小呀或者压缩缩放等等,然后现在我的业务这边的话,就涉及了这种对图片的处理,但是目前我们都是交给前端来处理这个东西,那如果说我在传输给前端之前就对这个图片进行了一个处理,会不会在传输的过程之中就能优化他的效率?就是说现在对于图片的加工,我们现在是用前端来做的,就后端不对图片进行加工,然后我想,如果说我在后端就已经加工好了,那我以一个更小的体积传给前端。直接进行渲染会不会效率更高呢?不然的话,不经过加工的话,他的体积肯定是更大的呀,那在传输过程之中占用的资源也会更多,既然他们结果都是处理成那样子,那我在后端处理的话,会不会就是说能让我传输的更加顺畅呢?但是。我觉得事情没有想象的那么理想,但我又想不出这样子做会有什么坏处

对于该图片的处理库,有兴趣的伙伴可以看看下面这篇文章:

【Thumbnailator】图片压缩、水印、格式修改一网打尽icon-default.png?t=N7T8https://blog.csdn.net/weixin_73077810/article/details/134590545?spm=1001.2014.3001.5501

疑惑点1: 同一张图片,在不同的位置上展示的效果是不一致的业务需求怎么实现才是合理的?

疑惑点2:什么时候是需要前端来进行加工操作,什么时候是需要后端来进行加工操作?


大牛解答: 

        我跟技术总监聊了一下,我发现这类需求好像有一类比较合理的处理方法

解答疑惑点1:

        实际上对于图片来说的话,他在上传后就已经是把它处理好了再进行存储,比如说我上传了一张图片,然后这张图片分别要用在两个地方,并且这两个地方上他是不同大小的,就是说它的尺寸会有所变化,那这样子我上传图片的话,我在后端接收好,我就已经把这两个图片裁剪为两个格式了,然后把这两个不同格式的同一张图片以一个跟前端约定好的命名规范,比如说A1 A2这样子,也就是说我前端上传图片后,我在后端已经把他弄成了最终要渲染的格式了,前端最后如果想要拿图片的话,直接就是通过一个URL拿到那个图片,直接就进行渲染就行,不需要进行二次加工,最终这种方案的话,他就实现了一种一张图片,我只需要在上传保存的时候加工一次,之后的话就不需要再进行二次加工

        就拿我们微信头像来说,微信头像他不是很小的一个缩略图吗?然后我们点开它的话,可以让他放大对吧,然后我本来以为的是他用的是同一张图片,只不过前端对他进行了一个压缩处理呀,这样子的二次加工来进行渲染的,但实际上他就是两张图片一大一小的,然后当我们正常展示的时候,前端访问的是小的图片,当我们要点击放大的时候,前端就直接就换了一个URL来获取大的图片

        然后对于这种同一类不同规格的图片,我们采用一个类型差不多的有规律的命名方式,然后前端只需要把那一个有所变动的路径位置,把他们作为一个变量,如果说我要访问一个东西的话,我只需要在变量上操作就行,不需要直接改动我的那个URL了,因为他的变动只是小位置的变动,而不是整个URL的变动

解答疑惑点2:

        对于这种图片类的话,实际上基本上都是用后端来进行压缩呀,加水印或者什么什么的,前端的话仅仅只是做一些基础的校验,比如说对图片大小啊,以及它的那个它的格式啊,如说是那个JPG啊,或者是PNG这些的校验。还有一种就是说,比如说我们的一些APP头像不是圆形的吗?然后我们上传的是方形的图片,那我们是不是要进行一个手动的选择裁剪,这种的话就是前端来做的,然后的话,那些对于缩略图啊,以及一些那个大小尺寸的压缩,这些的话就是用后端来做。


重点:看需求,不盲目进行优化 

上面这种方案看似比较ok,但是并没有一个方案是完美的,没有最好的方案,只有最合适的方案!

上述方案主要是靠后端来实现一些图片业务优化的操作,而实际上前端也会有很多方案可以进行优化,比如:

页面图标的渲染——精灵图,一张图包含了所有的图标,前端只需要定位图标位置展示即可,这样子,就可以减少网络io的次数

对于资源的渲染——懒加载和预渲染

        懒加载——指在页面加载时,只加载可视区域内的图片,而延迟加载其他区域的图片。其原理是通过监听滚动事件或者计算图片与可视区域的相对位置,当图片进入可视区域时再进行加载。懒加载可以减少初始页面加载时的网络请求和资源消耗,提高页面加载速度和用户体验。

        预渲染——指在页面加载时,提前加载未被用户请求的图片资源。其原理是在页面加载完成后,通过异步请求或者动态创建<link rel="preload">标签,预先加载将要用到的图片资源。预渲染可以减少用户在浏览过程中的等待时间,提高图片的加载速度和用户体验。


        我们也许能实现一个需求的功能,就好像一只飞翔的鸟儿,我们能让它飞起来,但是我们要追求的应该是怎么才能让它飞的更加自由,更加轻松!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

寻找多个项目的漏洞赏金实战,不同技术的详细实现

寻找多个项目的漏洞赏金实战,不同技术的详细实现。 破-解Slack App得到3500美金漏洞赏金 文章的核心要点如下: 漏洞发现:作者在Slack的安卓应用中发现了一个漏洞。这个漏洞是由于目录遍历,导致可以窃取密码。这个漏洞的重要性在于,它允许“跳跃”在账户之间,也就是说,你…

[kingbase锁等待问题分析]

参考文章:https://www.modb.pro/db/70021 概述 为了确保复杂的事务可以安全地同时运行&#xff0c;kingbase&#xff08;PostgreSQL&#xff09;提供了各种级别的锁来控制对各种数据对象的并发访问&#xff0c;使得对数据库关键部分的更改序列化。事务并发运行&#xff0c;直到…

关闭EntityFramework日志输出SQL

项目场景&#xff1a; 提示&#xff1a;这里简述项目相关背景&#xff1a; EntityFramework日志输出SQL 问题描述 提示&#xff1a;这里描述项目中遇到的问题&#xff1a; EntityFramework日志输出SQL&#xff0c;造成发布后&#xff0c;无效日志太多&#xff0c;且容器化部…

Linux安全之AIDE系统入侵检测工具安装和使用

一、AIDE 系统入侵检测工具简介 AIDE&#xff0c;全称为Advanced Intrusion Detection Environment&#xff0c;是一个主要用于检测文件完整性的入侵检测工具。它能够构建一个指定文件的数据库&#xff0c;并使用aide.conf作为其配置文件。AIDE数据库能够保存文件的各种属性&am…

Django(十、中间件)

文章目录 一、中间件的介绍中间件有什么用中间件功能自定义中间中间件的顺序 一、中间件的介绍 中间件顾名思义&#xff0c;是介于request与response处理之间的一道处理过程&#xff0c;相对比较轻量级&#xff0c;并且在全局上改变django的输入与输出。因为改变的是全局&…

U盘启动制作工具Rufus

U盘启动制作工具Rufus 下载U盘启动制作工具Rufus&#xff0c;进入Rufus官网&#xff1a;http://rufus.ie/en/&#xff0c;打开之后往后滑动&#xff0c;找到download即可点击下载。 需要插入U盘 首先需要插入U盘&#xff0c;如果U盘有重要文件一定要备份&#xff0c;然后右键…

mysql安装亲测有效

http://t.csdnimg.cn/UHuy4

Grails 启动

Grails系列 Grails项目启动 文章目录 Grails系列Grails一、项目创建二、可能的问题1.依赖下载2.项目导入到idea失败3.项目导入到idea后运行报错 Grails Grails是一款基于Groovy语言的Web应用程序框架&#xff0c;它使用了许多流行的开源技术&#xff0c;如Spring Framework、…

Go语言初始化已有环境,跟踪已有依赖环境

在Go语言中&#xff0c;go.mod文件是Go模块的管理文件&#xff0c;用于跟踪和管理项目的依赖关系。go.sum 文件是 Go 语言模块的另一个关键文件&#xff0c;它记录了项目依赖的确切版本以及相应的哈希值。如果你得到了一个包含go.mod和go.sum文件的Go代码&#xff0c;&#xff…

内衣洗衣机怎么选?性价比高的小型洗衣机推荐

在机器解放了双手的时代中&#xff0c;洗衣机走进了千家万户&#xff0c;虽然在某种程度上缓解了人们手洗衣服的压力&#xff0c;但还是有不少人选择了人工手洗自己的内衣内裤&#xff0c;甚至连袜子都是手工洗的&#xff0c;这让人很是郁闷&#xff0c;倒不是说洗衣机不方便&a…

SpringBoot整合SpringSecurity+jwt+knife4生成api接口(从零开始简单易懂)

一、准备工作 ①&#xff1a;创建一个新项目 1.事先创建好一些包 ②&#xff1a;引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency>&…

可以远程控制电脑桌面的软件有哪些?

随着电脑办公的普及&#xff0c;人们对于远程控制电脑的需求也越来越大。远程控制电脑技术能够让用户在不同地点的电脑之间进行操作和访问&#xff0c;能够提高工作效率。可以远程控制电脑桌面的软件有哪些&#xff1f; 1. 远程监控电脑软件 需要安装在被控制端电脑&#xff…

【cppcheck 静态代码分析工具使用教程】

cppcheck 是一个流行的静态代码分析工具,用于 C 和 C++ 程序。它可以帮助检测代码中的错误、未定义的行为、内存泄漏等。在 Ubuntu 系统上使用 cppcheck 的基本步骤和示例如下: 安装 cppcheck 打开终端。使用以下命令安装 cppcheck:sudo apt-get update sudo apt-get insta…

linux -系统通用命令查询

有时候内网环境下&#xff0c;系统有些命令没有安装因此掌握一些通用的linux 命令也可以帮助我们解决一些问题查看 1.查看系统内核版本 uname -r2.查看系统版本 cat /etc/os-release3. 查看cpu 配置 lscpu4.查看内存信息 free [参数] 中各个数值的解释如下表 数值解释t…

4.并发中的各种锁概念

目录 概述锁分类按上锁方式划分按特性划分悲观锁/乐观锁重入锁/不可重入锁公平锁/非公平锁独享锁/共享锁 其它自旋锁分段锁无锁/偏向锁/轻量级锁/重量级锁 结束 概述 java 锁分类&#xff0c;虽是概念&#xff0c;很常见。 锁分类 按上锁方式划分 锁关键字解释隐式锁synchr…

提高工作效率的宝藏网站和宝藏工具(高级版)

一、参考资料 亲测&#xff1a;你这些网站都不知道&#xff0c;哪来时间去摸鱼&#xff1f; 提高工作效率的宝藏网站和宝藏工具&#xff08;基础版&#xff09; 二、好用的网站 HelloGitHub - 开源项目平台 HelloGitHub 是一个分享有趣、 入门级开源项目的平台。 希望大家能…

MySQL-02-InnoDB存储引擎

实际的业务系统开发中&#xff0c;使用MySQL数据库&#xff0c;我们使用最多的当然是支持事务并发的InnoDB存储引擎的这种表结构&#xff0c;下面我们介绍下InnoDB存储引擎相关的知识点。 1-Innodb体系架构 InnoDB存储引擎有多个内存块&#xff0c;可以认为这些内存块组成了一…

qgis添加arcgis的mapserver

左侧浏览器-ArcGIS地图服务器-右键-新建连接 Folder: / 展开-双击图层即可

oracle 表树形结构查询递归查询

简介&#xff1a; WITH RECURSIVE 是一种在关系型数据库中处理递归查询的语法。 举例&#xff1a; 假设我们有一个树形结构数据表 tree_table&#xff0c; 包含节点的 ID、父节点的 ID 和节点名称等字段。 示例表数据&#xff1a; --------------- | id | pid | name | ----…

物联网AI MicroPython学习之语法 I2S音频总线接口

学物联网&#xff0c;来万物简单IoT物联网&#xff01;&#xff01; I2S 介绍 模块功能: I2S音频总线驱动模块 接口说明 I2S - 构建I2S对象 函数原型&#xff1a;I2S(id, sck, ws, sd, mode, bits, format, rate, ibuf)参数说明&#xff1a; 参数类型必选参数&#xff1f…