軟件開發中對圖片的加工處理的一些個人思考和總結

前言:

? ? ? ? 最近在公司做項目的時候,有一個業務場景就是同一張圖片,在不同的位置上展示的效果是不一致的,其實理解起來也很簡單,就以大家熟悉的微信頭像而言,我們在正常使用的情況下,一個微信頭像的大小假設為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.pswp.cn/news/166053.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/166053.shtml
英文地址,請注明出處:http://en.pswp.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…