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

前言:

        最近在公司做项目的时候,有一个业务场景就是同一张图片,在不同的位置上展示的效果是不一致的,其实理解起来也很简单,就以大家熟悉的微信头像而言,我们在正常使用的情况下,一个微信头像的大小假设为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;直到…

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;然后右键…

Grails 启动

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

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

在机器解放了双手的时代中&#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>&…

linux -系统通用命令查询

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

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

一、参考资料 亲测&#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: / 展开-双击图层即可

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

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

关于接口测试自动化的总结与思考!

序 近期看到阿里云性能测试 PTS 接口测试开启免费公测&#xff0c;本着以和大家交流如何实现高效的接口测试为出发点&#xff0c;本文包含了我在接口测试领域的一些方法和心得&#xff0c;希望大家一起讨论和分享&#xff0c;内容包括但不仅限于&#xff1a; 服务端接口测试介…

Vatee万腾的科技冒险:vatee创新力量的前沿发现

在当今飞速发展的科技潮流中&#xff0c;Vatee万腾以其独特的创新力量成为前沿的引领者。这场科技冒险不仅仅是技术的迭代&#xff0c;更是一次前所未有的前沿发现之旅&#xff0c;让我们一同深入探索Vatee万腾的科技冒险&#xff0c;感受vatee创新力量的前沿奇迹。 Vatee万腾将…

机器学习---最大似然估计和贝叶斯参数估计

1. 估计 贝叶斯框架下的数据收集&#xff0c;在以下条件下我们可以设计一个可选择的分类器 : P(wi) (先验)&#xff1b;P(x | wi) (类条件密度) 但是。我们很少能够完整的得到这些信息! 从一个传统的样本中设计一个分类器&#xff1a; ①先验估计不成问题 ②对类条件密度…

git本地账户如何从一台电脑迁移到另外一台

为了表述方便&#xff0c;我们此处用旧电脑、新电脑指代。 在新电脑上安装git 例如&#xff0c;我旧电脑上安装的git版本是2.33.1版本&#xff0c;新电脑安装git的版本是2.43.0&#xff0c;这不妨碍迁移。 将git的全局配置文件从旧电脑拷贝到新电脑 Git的全局配置文件&…

“关爱零距离.情暖老人心”主题活动

为提高社区老年人的生活质量&#xff0c;促进邻里间的互动与友谊&#xff0c;以及弘扬尊老爱幼的社区精神&#xff0c;11月21日山东省潍坊市金阳公益服务中心、重庆市潼南区同悦社会工作服务中心在潼南区桂林街道东风社区共同在潼南区桂林街道东风社区举办了“关爱零距离.情暖老…

22款奔驰S400L升级原厂360全景影像 高清环绕 无死角

360全景影像影像系统提升行车时的便利&#xff0c;不管是新手或是老司机都将是一个不错的配置&#xff0c;无论是在倒车&#xff0c;挪车以及拐弯转角的时候都能及时关注车辆所处的环境状况&#xff0c;避免盲区事故发生&#xff0c;提升行车出入安全性。 360全景影像包含&…

自学编程,用好这几个网站就够了!

如果你要自学编程&#xff0c;一定要收藏好这7个网站&#xff0c;上面免费的优质教程很多&#xff0c;完全可以省去你上万块钱的学费&#xff01; 话不多说&#xff0c;直接上干货&#xff01; 第一个&#xff0c;W3school 一个主打图文教程的网站&#xff0c;不管是前端开发…