如何讓你的圖片服務也有類似OSS的圖片處理功能

原文鏈接

前言

有自己機房的公司一般都有一套存儲系統用于存儲公司的圖片、視頻、音頻、文件等數據,常見的存儲系統有以NAS、FASTDFS為代表的傳統文件存儲,和以Minio為代表的對象存儲系統,隨著云服務的興起很多公司逐漸將數據遷移到以阿里云OSS為代表的云對象存儲,OSS的好處是不但解決了數據的存儲還自帶的很多文件的處理功能,如圖片的縮放、打水印、裁剪等功能,例如我們要獲獲取一張寬為200大小的圖片只需要在原圖后面增加?x-oss-process=image/resize,w_200這個參數就可以了,處理圖片確實非常方便。
https://oss-console-img-demo-cn-hangzhou.oss-cn-hangzhou.aliyuncs.com/example.jpg?x-oss-process=image/resize,w_200。
傳統的NAS、FASTDFS只有存儲功能,沒有文件處理能力的,我們可以使用圖片處理軟件給它加上類似的圖片處理功能。常用的圖片處理軟件有ImagemagickGraphicsMagickOpenCV對應的JAVA操作庫為im4javaJMagickJavacv。用上這些圖片處理軟件再配置Nginx+Lua或者OpenResty就可以讓你的傳統NAS存儲也也有像OSS一樣的圖片處理能力。

ImageMagick、GraphicsMagick的安裝

ImageMagick官網下載

官網下載地址:https://imagemagick.org/script/download.php
以windows為例,下載ImageMagick-7.1.1-15-Q16-HDRI-x64-dll.exe ,然后下一步、下一步安裝就好了,安裝完成后輸入magick -version檢查是否安裝成功:

PS C:\Users\Administrator> magick -version
Version: ImageMagick 7.1.1-15 Q16-HDRI x64 a0a5f3d:20230730 https://imagemagick.org
Copyright: (C) 1999 ImageMagick Studio LLC
License: https://imagemagick.org/script/license.php
Features: Cipher DPC HDRI Modules OpenCL OpenMP(2.0)
Delegates (built-in): bzlib cairo flif freetype gslib heic jng jp2 jpeg jxl lcms lqr lzma openexr pangocairo png ps raqm raw rsvg tiff webp xml zip zlib
Compiler: Visual Studio 2022 (193532217)

GraphicsMagick官網下載

GraphicsMagick最初源于ImageMagick5.5.2(2002年11月),但從那時起就完全獨立于ImageMagick項目。自從ImageMagick的fork以來,許多作者使用開放的開發模型進行了許多改進(參見新聞),但沒有破壞API或實用程序操作。下載地址:
http://www.graphicsmagick.org/download.html
安裝完成后輸出gm檢測是否安裝成功。

C:\Users\Administrator>gm
GraphicsMagick 1.3.40 2023-01-14 Q16 http://www.GraphicsMagick.org/
Copyright (C) 2002-2023 GraphicsMagick Group.
Additional copyrights and licenses apply to this software.
See http://www.GraphicsMagick.org/www/Copyright.html for details.
Usage: gm command [options ...]

JAVA操作

JAVA操作GraphicsMagick可以使用im4java
引入POM依賴im4java

        <dependency><groupId>org.im4java</groupId><artifactId>im4java</artifactId><version>1.4.0</version></dependency>

im4java官網地址:
https://im4java.sourceforge.net

im4java源碼地址:im4java download | SourceForge.net

JAVA操作ImageMagick可以使用JMagick,引入POM依賴:

<dependency><groupId>jmagick</groupId><artifactId>jmagick</artifactId><version>6.6.9</version>
</dependency>

JMagick官網地址:www.jmagick.org

JMagick源碼地址:JMagick download | SourceForge.net

圖片信息獲取

命令獲取圖片信息

 magick identify .\1.jpg
.\1.jpg PNG 1920x1080 1920x1080+0+0 8-bit sRGB 1.31707MiB 0.000u 0:00.000//格式化輸出
magick identify -format '%W,%H,%B,%f,%m'  .\1.jpg
1920,1080,1381050,1.jpg,PNG

JAVA獲取圖片信息

    @Testpublic void info() throws IOException, InterruptedException, IM4JavaException {String iImageDir = "C:\\Users\\Administrator\\Desktop\\img\\1.jpg";IMOperation operation = new IMOperation();//格式化輸出//operation.format("%W,%H,%B,%f,%m");operation.addImage(iImageDir);IdentifyCmd indentity = new IdentifyCmd();ArrayListOutputConsumer output = new ArrayListOutputConsumer();indentity.setOutputConsumer(output);indentity.run(operation);ArrayList<String> cmdOutput = output.getOutput();String line = cmdOutput.get(0);System.out.println(line);//C:\Users\Administrator\Desktop\img\1.jpg PNG 1920x1080 1920x1080+0+0 8-bit sRGB 1.31707MiB 0.000u 0:00.000}

注意事項

  1. 如果運行代碼報org.im4java.core.CommandException: java.io.IOException: Cannot run program "identify": CreateProcess error=2, 系統找不到指定的文件。是因為剛安裝軟件,系統沒找到命令,重啟電腦后就可以解決。

  2. 可以使用-format '%W,%H,%B,%f,%m'來格式化圖片信息的輸出 ,具體的格式化參數有很多,詳細可以參考官方文檔,你想要的圖片信息應該都是有的。https://imagemagick.org/script/escape.phps

圖片縮放

命令圖片縮放

magick .\1.jpg -resize 200x100 1_w200h100.jpg
magick identify -format '%W,%H,%B,%f,%m'  .\1_w200h100.jpg
輸出:
178,100,8003,1_w200h100.jpg,JPEG

JAVA圖片縮放

    @Testpublic void resizeImg() throws IOException, InterruptedException, IM4JavaException {String srcImagePath = "C:\\Users\\Administrator\\Desktop\\img\\1.jpg";Integer width = 200;Integer height = 100;String newImagePath = "C:\\Users\\Administrator\\Desktop\\img\\1_w200h100.jpg";IMOperation op = new IMOperation();op.addImage(srcImagePath);op.resize(width, height);op.addImage(newImagePath);ImageCommand convert = new ConvertCmd();convert.run(op);}

注意事項

這里我們使用 -resize 200x100 想生成一張200x100的圖片,結果輸出圖片是178x100,因為原始圖片為1920x1080為了保持圖片寬高比例,做了等比例縮放,防止圖片變形。

圖片打水印

命令圖片打水印

 magick composite  -geometry  '200x200+100+50'  -gravity  'center'  .\avatar.png .\1.jpg  1_avater.jpg

JAVA圖片打水印

    @Testpublic void testaddImgWatermark() throws Exception {String srcImagePath="D://img/1.jpg";String destImagePath="D://img/1_avater.jpg";String waterImgPath="D://img/avatar.png";IMOperation op = new IMOperation();//水印大小op.geometry(1000,1000,1000,500);// 水印圖片位置NorthWest, North, NorthEast, West, Center, East, SouthWest, South, SouthEastop.gravity("NorthEast");// 水印透明度op.dissolve(100);// 水印op.addImage(waterImgPath);// 原圖op.addImage(srcImagePath);// 目標op.addImage(destImagePath);ImageCommand cmd = new CompositeCmd();cmd.run(op);}

注意事項

  1. -geometry '200x200+100+50' 中的200x200是設置水印圖片的大小,+200+50設置水印圖片相對于gravity的位置
  2. -gravity 'center'是給定水印的相對原圖的位置,支持NorthWest, North, NorthEast, West, Center, East, SouthWest, South, SouthEast,這個參數和阿里OSS加水印的也是一樣的。

最終打出水印的效果如下:

image.png

圖片裁剪

命令圖片裁剪

magick convert -gravity  'center'   .\1_avater.jpg -crop  200x200+100+50 1_cut.jpg

JAVA圖片裁剪

    @Testpublic  void testCrop()  throws Exception {String srcImagePath="D://img//1.jpg";String destImagePath="D://img/1_cut.jpg";IMOperation op = new IMOperation();op.gravity("center");op.addImage(srcImagePath);op.crop( 200,200,100,50);op.addImage(destImagePath);ImageCommand cmd  = new ConvertCmd();cmd.run(op, srcImagePath, destImagePath);}

最張裁剪效果:

image.png

注意事項

  1. -crop 200x200+100+50 結合 -gravity 'center'剛好可以把我們打上的水印裁剪出來;
  2. 裁剪出的圖片在左右兩邊還是有一點紅色邊框,這個可能是計算有一兩個像素誤差。

圖片加參數自動處理

有了以上的圖片處理命令之后想要實現OSS ?x-oss-process=image/resize,w_200這樣加參數處理圖片可以使用Nginx+Lua來實現,集成了Lua模塊的Nginx項目OpenResty

例如我們原始圖片地址:

http://127.0.0.1/img/1.jpg

自動縮放圖片尺寸:

http://127.0.0.1/img/1_400x400.jpg

  1. 下載安裝 OpenResty - Download
  2. 下載安裝LUA Release Lua for Windows v5.1.5-52 Released · rjpcomputing/luaforwindows · GitHub

Nginx配置引入Lua:

http {lua_package_path 'D:\software\openresty\lualib\\?.lua;;';lua_package_cpath 'D:\software\openresty\lualib\\?.so;;';
}

Nginx配置文件中可以寫成這樣:

 location ~ '/img/(\d+)_(\d+)x(\d+).jpg$' {root D:/img;set $img_root  "D:/img/img";set $fileName  ngx.arg[1];set $width  ngx.arg[2];set $height  ngx.arg[3];set $origin "${img_root}/${fileName}.jpg" ;set $file  "${img_root}/${fileName}_${width}x${height}.jpg";if (!-f $file) {rewrite_by_lua 'local command = "magick  "..ngx.var.origin.." -resize "..ngx.var.width.."x" ..ngx.var.height.." "..ngx.var.file;os.execute(command);';}}

當訪問(http://127.0.0.1/img/1_400x400.jpg時可動態生成對應尺寸圖片,類似OSS的功能:

image.png

生成的文件,當然我們還可以使用Lua+Redis緩存這里生成的文件,如果有CDN還可以配置CDN緩存這些文件,下次就可以從CDN緩存直接取對應尺寸的圖片了,減少服務器處理圖片的性能消耗。很多大廠不將這種圖片處理下沉到CDN邊緣節點,利用離用戶最近CDN節點完成圖片數據的處理,減少數據回源,從而減少中心服務器的性能消耗。

image.png

當然這個只是使用Nginx+Lua+GraphicsMagick來實現簡單的圖片裁剪功能,如果要實現阿里OSS圖片處理要比這個復雜的多,不僅要解決大量文件存儲高可要和自動擴容問題,還要解決高并發下圖片裁剪的性能問題,們只是通過這個案例了解圖片自動縮放的基本原理,原理看起來比較簡單,想要做的好而且還要給全國那么多企業用,要保持高可用、高性能就比較有難度了。

總結

本文主要介紹了常用圖片處理軟件ImageMagick的使用,并通過命令和JAVA代碼演示圖片信息的獲取、縮放、打水印、裁剪功能,在最后通過OpenResty+Lua實現類似OSS的自動圖片縮放功能。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/34951.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/34951.shtml
英文地址,請注明出處:http://en.pswp.cn/news/34951.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

二叉樹的性質和完全二叉樹的性質

二叉樹的性質&#xff1a; 在二叉樹的第i層至多有 2 i 1 ( i > 1 ) 2^{i1}(i>1) 2i1(i>1) 深度為k的二叉樹最多有 2 k ? 1 2^k-1 2k?1個結點 對于任意一棵二叉樹T&#xff0c;如果其終端結點數為 n 0 n_0 n0?&#xff0c;度為2的結點數為 n 2 n_2 n2?,則 n 0 …

【劍指 Offer 39】數組中超過一半的數字

題目&#xff1a; 數組中有一個數字出現的次數超過數組長度的一半&#xff0c;請找出這個數字。 你可以假設數組是非空的&#xff0c;并且給定的數組總是存在多數元素。 示例&#xff1a; 輸入: [1, 2, 3, 2, 2, 2, 5, 4, 2] 輸出: 2 思考&#xff1a; 方法一&#xff1a;投…

5.0 Python 定義并使用函數

函數是python程序中的基本模塊化單位&#xff0c;它是一段可重用的代碼&#xff0c;可以被多次調用執行。函數接受一些輸入參數&#xff0c;并且在執行時可能會產生一些輸出結果。函數定義了一個功能的封裝&#xff0c;使得代碼能夠模塊化和組織結構化&#xff0c;更容易理解和…

企業有VR全景拍攝的需求嗎?能帶來哪些好處?

在傳統圖文和平面視頻逐漸疲軟的當下&#xff0c;企業商家如何做才能讓遠在千里之外的客戶更深入、更直接的詳細了解企業品牌和實力呢&#xff1f;千篇一律的紙質材料已經過時了&#xff0c;即使制作的再精美&#xff0c;大家也會審美疲勞&#xff1b;但是你讓客戶遠隔千里&…

(MySQL經驗)之MySQL單表行數最好低于2000w

作為在后端開發&#xff0c;是不是經常聽到過&#xff0c;mysql 單表最好不要超過 2000w,單表超過 2000w 就要考慮數據遷移了&#xff0c;表數據都要到 2000w &#xff0c;查詢速度變得賊慢。 1、建表操作 建一張表 CREATE TABLE person( id int NOT NULL AUTO_INCREMENT PRI…

如何讓ES低成本、高性能?滴滴落地ZSTD壓縮算法的實踐分享

前文分別介紹了滴滴自研的ES強一致性多活是如何實現的、以及如何提升ES的性能潛力。由于滴滴ES日志場景每天寫入量在5PB-10PB量級&#xff0c;寫入壓力和業務成本壓力大&#xff0c;為了提升ES的寫入性能&#xff0c;我們讓ES支持ZSTD壓縮算法&#xff0c;本篇文章詳細展開滴滴…

Python 監控 Windows 服務

Python 監控 Windows 服務 Python 在 Windows 系統上可以使用 wmi 模塊來實現對 Windows 服務的監控。本文將介紹如何使用 Python 監控 Windows 服務&#xff0c;并實現服務狀態的查詢和服務啟停功能。 安裝依賴 在使用 wmi 模塊之前&#xff0c;需要先安裝 wmi包。可以使用…

[excel]vlookup函數對相同的ip進行關聯

一、需求&#xff08;由于ip不可泄漏所以簡化如下&#xff09; 有兩個sheet: 找到sheet1在sheet2中存在的ip&#xff0c;也就是找到有漏洞的ip 二、實現 vlookup函數有4個參數 第一個:當前表要匹配的列&#xff0c;選擇第一個sheet當前行需要處理的ip即可 第二個:第二個shee…

linux內核bitmap之setbit匯編實現

內核版本&#xff1a;kernel 0.12 首先看一段代碼&#xff0c;下面這段代碼來自內核版本0.12的mm/swap.c中&#xff1a; // mm/swap.c #define bitop(name,op) \static inline int name(char * addr,unsigned int nr) \ { \int __res; \__asm__ __volatile__("bt" …

蟻劍antSword-maste下載-安裝-使用-一句話木馬

下載 https://github.com/AntSwordProject/antSword 一句話木馬 hack.php腳本 <?php eval($_POST[attack]);?> 安裝 1、安裝完成后啟動 2、初始化&#xff0c;選擇有源碼的目錄 3、連接

03 什么是預訓練(Transformer 前奏)

博客配套視頻鏈接: https://space.bilibili.com/383551518?spm_id_from=333.1007.0.0 b 站直接看 配套 github 鏈接:https://github.com/nickchen121/Pre-training-language-model 配套博客鏈接:https://www.cnblogs.com/nickchen121/p/15105048.html 預訓練有什么用 機器學…

Linux(Web與html)

域名 DNS與域名&#xff1a; 網絡是基于tcp/ip協議進行通信和連接的 tcp/ip協議是五層協議&#xff1a;應用層–傳輸層—網絡層----數據鏈路層----物理層每一臺主機都有一個唯一的地址標識&#xff08;固定的ip地址&#xff0c;用于區分用戶和計算機。 ip地址&#xff1a;由…

深入淺出:MyBatis的使用方法及最佳實踐

這里寫目錄標題 添加MyBatis框架?持配置連接字符串和MyBatis配置連接字符串配置 MyBatis 中的 XML 路徑 添加業務代碼創建數據庫和表添加用戶實體類添加 mapper 接?添加 UserMapper.xml添加 Service層添加 Controller層 增刪改操作增加操作刪除操作修改操作 添加MyBatis框架?…

JVM 基礎

鞏固基礎&#xff0c;砥礪前行 。 只有不斷重復&#xff0c;才能做到超越自己。 能堅持把簡單的事情做到極致&#xff0c;也是不容易的。 JVM 類加載機制 JVM 類加載機制分為五個部分&#xff1a;加載&#xff0c;驗證&#xff0c;準備&#xff0c;解析&#xff0c;初始化&am…

Hadoop安裝完全分布式搭建

1、安裝Hadoop 上傳Hadoop的指定路徑/root/softwares 解壓安裝 cd /root/softwares && tar -zxvf hadoop-2.7.3.tar.gz -C /usr/local配置環境變量 vim /etc/profile # Hadoop Environment export HADOOP_HOME/usr/local/hadoop-2.7.3 export PATH$PATH:$HADOOP_HOM…

openCV使用c#操作攝像頭

效果如下&#xff1a; 1.創建一個winform的窗體項目&#xff08;框架.NET Framework 4.7.2&#xff09; 2.Nuget引入opencv的c#程序包&#xff08;版本最好和我一致&#xff09; 3.后臺代碼 using System; using System.Collections.Generic; using System.ComponentModel;…

用友-NC-Cloud遠程代碼執行漏洞[2023-HW]

用友-NC-Cloud遠程代碼執行漏洞[2023-HW] 一、漏洞介紹二、資產搜索三、漏洞復現PoC小龍POC檢測腳本: 四、修復建議 免責聲明&#xff1a;請勿利用文章內的相關技術從事非法測試&#xff0c;由于傳播、利用此文所提供的信息或者工具而造成的任何直接或者間接的后果及損失&#…

Leetcode-每日一題【劍指 Offer 24. 反轉鏈表】

題目 定義一個函數&#xff0c;輸入一個鏈表的頭節點&#xff0c;反轉該鏈表并輸出反轉后鏈表的頭節點。 示例: 輸入: 1->2->3->4->5->NULL輸出: 5->4->3->2->1->NULL 限制&#xff1a; 0 < 節點個數 < 5000 解題思路 1.題目要求我們反轉…

Windows下運行Tomcat服務時報GC Overhead Limit Exceeded

根本原因是在新建Tomcat作為Windows服務時&#xff0c;系統默認設置的堆內存太小了&#xff0c;我們打開/bin/service.bat文件&#xff0c;將如下圖所示的默認值改大一些就好了 if "%JvmMs%" "" set JvmMs512 if "%JvmMx%" "" set J…

高防cdn和高防服務器有什么不一樣?

高防cdn&#xff1a; 相信很多看過我們文章的小伙伴對cdn已經很了解了&#xff0c;cdn的原理很簡單&#xff0c;就是構建在網絡上的很多個節點&#xff0c;為網站作內容 分發。使用戶就近獲取所需資源。且分配的cdn節點都是高防節點&#xff0c;每個節點都有防御功能。還…