




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第java實(shí)現(xiàn)1M圖片壓縮優(yōu)化到100kb實(shí)現(xiàn)示例目錄引言一、圖像壓縮二、Java數(shù)字圖像處理三、圖像壓縮實(shí)戰(zhàn)四、其他開(kāi)源庫(kù)五、一點(diǎn)點(diǎn)心聲
引言
坦白從寬吧,我就是那個(gè)花了兩天兩夜把1M圖片優(yōu)化到100kb的家伙王小二!
自從因?yàn)橐黄獔?bào)道登上熱搜后,我差點(diǎn)抑郁,每天要靠50片安眠藥才能入睡。
網(wǎng)絡(luò)上曝光的那些關(guān)于一碼通的消息,有真有假,我這里就不再澄清了。就說(shuō)說(shuō)我是怎么把圖片從1M優(yōu)化到100kb的故事吧。
是的,由于系統(tǒng)群體規(guī)模和訪問(wèn)規(guī)模的特殊性,每一行代碼、每一張圖片、每一個(gè)技術(shù)文檔都反復(fù)核準(zhǔn),優(yōu)化再優(yōu)化,精益求精。為確保系統(tǒng)運(yùn)行得更高效,我們將一張圖片從1MB壓縮到500KB,再?gòu)?00KB優(yōu)化到100KB。
這樣的工作在外人看起來(lái),簡(jiǎn)單到就好像悄悄給學(xué)妹塞一張情書(shū)就能讓她做我女朋友一樣簡(jiǎn)單。
但殊不知,這其中蘊(yùn)含著極高的技術(shù)含量!
不信,我給你們普及下。
一、圖像壓縮
圖像壓縮是數(shù)據(jù)壓縮技術(shù)在數(shù)字圖像上的應(yīng)用,目的是減少圖像數(shù)據(jù)中的冗余信息,從而用更加高效的格式存儲(chǔ)和傳輸數(shù)據(jù)。
圖像壓縮可以是有損數(shù)據(jù)壓縮,也可以是無(wú)損數(shù)據(jù)壓縮。
怎么樣?
是不是感覺(jué)圖像壓縮技術(shù)沒(méi)有想象中那么簡(jiǎn)單了?
更多關(guān)于圖像壓縮的資料可參考以下鏈接。
/article/150789.htm
二、Java數(shù)字圖像處理
作為這次20多萬(wàn)外包項(xiàng)目的主力開(kāi)發(fā)人員,我這里就給大家介紹下Java數(shù)字圖像處理技術(shù)吧,一開(kāi)始我就是用它來(lái)處理圖片的。
數(shù)字圖像處理(DigitalImageProcessing)是通過(guò)計(jì)算機(jī)對(duì)圖像進(jìn)行去除噪聲、增強(qiáng)、復(fù)原、分割、提取特征等處理的方法和技術(shù)。
輸入的是圖像信號(hào),然后經(jīng)過(guò)DIP進(jìn)行有效的算法處理后,輸出為數(shù)字信號(hào)。
為了壓縮圖像,我們需要讀取圖像并將其轉(zhuǎn)換成BufferedImage對(duì)象,BufferedImage是Image類的一個(gè)子類,描述了一個(gè)具有可訪問(wèn)的圖像數(shù)據(jù)緩沖區(qū),由ColorModel和Raster的圖像數(shù)據(jù)組成。
廢話我就不多說(shuō)了,直接進(jìn)入實(shí)戰(zhàn)吧!
三、圖像壓縮實(shí)戰(zhàn)
剛好我本地有一張之前用過(guò)的封面圖,離1M只差236KB,可以拿來(lái)作為測(cè)試用。
這其中要用到ImageIO類,這是一個(gè)靜態(tài)類,提供了一系列方法用來(lái)讀和寫(xiě)圖像,同時(shí)還可以對(duì)圖像進(jìn)行簡(jiǎn)單的編碼和解碼。
比如說(shuō)通過(guò)ImageIO.read()可以將圖像讀取到BufferedImage對(duì)象:
Fileinput=newFile("ceshi.jpg");
BufferedImageimage=ImageIO.read(input);
比如說(shuō)通過(guò)ImageIO.getImageWritersByFormatName()可以返回一個(gè)Iterator,其中包含了通過(guò)命名格式對(duì)圖像進(jìn)行編碼的ImageWriter。
IteratorImageWriterwriters=ImageIO.getImageWritersByFormatName("jpg");
ImageWriterwriter=(ImageWriter)writers.next();
比如說(shuō)通過(guò)ImageIO.createImageOutputStream()可以創(chuàng)建一個(gè)圖像的輸出流對(duì)象,有了該對(duì)象后就可以通過(guò)ImageWriter.setOutput()將其設(shè)置為輸出流。
FilecompressedImageFile=newFile("bbcompress.jpg");
OutputStreamos=newFileOutputStream(compressedImageFile);
ImageOutputStreamios=ImageIO.createImageOutputStream(os);
writer.setOutput(ios);
緊接著,可以對(duì)ImageWriter進(jìn)行一些參數(shù)配置,比如說(shuō)壓縮模式,壓縮質(zhì)量等等。
ImageWriteParamparam=writer.getDefaultWriteParam();
param.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
param.setCompressionQuality(0.01f);
壓縮模式一共有四種,MODE_EXPLICIT是其中一種,表示ImageWriter可以根據(jù)后續(xù)的set的附加信息進(jìn)行平鋪和壓縮,比如說(shuō)接下來(lái)的setCompressionQuality()方法。
setCompressionQuality()方法的參數(shù)是一個(gè)0-1之間的數(shù),0.0表示盡最大程度壓縮,1.0表示保證圖像質(zhì)量很重要。對(duì)于有損壓縮方案,壓縮質(zhì)量應(yīng)該控制文件大小和圖像質(zhì)量之間的權(quán)衡(例如,通過(guò)在寫(xiě)入JPEG圖像時(shí)選擇量化表)。對(duì)于無(wú)損方案,壓縮質(zhì)量可用于控制文件大小和執(zhí)行壓縮所需的時(shí)間之間的權(quán)衡(例如,通過(guò)優(yōu)化行過(guò)濾器并在寫(xiě)入PNG圖像時(shí)設(shè)置ZLIB壓縮級(jí)別)。
整體代碼如下所示:
publicclassDemo{
publicstaticvoidmain(String[]args){
try{
Fileinput=newFile("ceshi.jpg");
BufferedImageimage=ImageIO.read(input);
IteratorImageWriterwriters=ImageIO.getImageWritersByFormatName("jpg");
ImageWriterwriter=(ImageWriter)writers.next();
FilecompressedImageFile=newFile("bbcompress.jpg");
OutputStreamos=newFileOutputStream(compressedImageFile);
ImageOutputStreamios=ImageIO.createImageOutputStream(os);
writer.setOutput(ios);
ImageWriteParamparam=writer.getDefaultWriteParam();
param.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
param.setCompressionQuality(0.01f);
writer.write(null,newIIOImage(image,null,null),param);
os.close();
ios.close();
writer.dispose();
}catch(IOExceptione){
e.printStackTrace();
執(zhí)行壓縮后,可以看到圖片的大小壓縮到了19KB:
可以看得出,質(zhì)量因子為0.01f的時(shí)候圖片已經(jīng)有些失真了,可以適當(dāng)提高質(zhì)量因子比如說(shuō)0.5f,再來(lái)看一下。
圖片質(zhì)量明顯提高了,但大小依然只有64KB,壓縮效果還是值得信賴的。
四、其他開(kāi)源庫(kù)
接下來(lái),推薦一些可以輕松集成到項(xiàng)目中的圖像處理庫(kù)吧,它們?nèi)际敲赓M(fèi)的。
1)ImageJ,用Java編寫(xiě)的,可以編輯、分析、處理、保存和打印圖像。
2)ApacheCommonsImaging,一個(gè)讀取和寫(xiě)入各種圖像格式的庫(kù),包括快速解析圖像信息(如大小,顏色,空間,ICC配置文件等)和元數(shù)據(jù)。
3)ImageMagick,可以讀取和寫(xiě)入超過(guò)100種格式的圖像,包括DPX、EXR、GIF、JPEG、JPEG-2000、PDF、PNG、Postscript、SVG和TIFF。還可以調(diào)整大小、翻轉(zhuǎn)、鏡像、旋轉(zhuǎn)、扭曲、剪切和變換圖像,調(diào)整圖像顏色,應(yīng)用各種特殊效果,包括繪制文本、線條、多邊形、橢圓和貝塞爾曲線。
4)OpenCV,由BSD許可證發(fā)布,可以免費(fèi)學(xué)習(xí)和商業(yè)使用,提供了包括C/C++、Python和Java等主流編程語(yǔ)言在內(nèi)的接口。OpenCV專為計(jì)算效率而設(shè)計(jì),強(qiáng)調(diào)實(shí)時(shí)應(yīng)用,可以充分發(fā)揮多核處理器的優(yōu)勢(shì)。
這里就以O(shè)penCV為例,來(lái)演示一下圖像壓縮。當(dāng)然了,OpenCV用來(lái)壓縮圖像屬于典型的大材小用。
第一步,添加OpenCV依賴到我們的項(xiàng)目當(dāng)中,以Maven為例。
dependency
groupIdorg.openpnp/groupId
artifactIdopencv/artifactId
version4.5.1-2/version
/dependency
第二步,要想使用OpenCV,需要先初始化。
OpenCV.loadShared();
第三步,使用OpenCV讀取圖片。
Matsrc=Imgcodecs.imread(imagePath);
第四步,使用OpenCV壓縮圖片。
MatOfIntdstImage=newMatOfInt(Imgcodecs.IMWRITE_JPEG_QUALITY,1);
Imgcodecs.imwrite("resized_image.jpg",sourceImage,dstImage);
MatOfInt的構(gòu)造參數(shù)是一個(gè)可變參數(shù),第一個(gè)參數(shù)IMWRITE_JPEG_QUALITY表示對(duì)圖片的質(zhì)量進(jìn)行改變,第二個(gè)是質(zhì)量因子,1-100,值越大表示質(zhì)量越高。
執(zhí)行代碼后得到的圖片如下所示:
借這個(gè)機(jī)會(huì),來(lái)對(duì)比下OpenCV和JDK原生API在壓縮圖像時(shí)所使用的時(shí)間。
這是我本機(jī)的配置情況,早年買的頂配iMac,也是我的主力機(jī)。一開(kāi)始只有16G內(nèi)存,后來(lái)加了一個(gè)16G內(nèi)存條,不過(guò)最近半年電腦突然死機(jī)重啟的頻率明顯提高了,不知道是不是BigSur這個(gè)操作系統(tǒng)的問(wèn)題還是電腦硬件老了。
結(jié)果如下所示:
opencvCompress壓縮完成,所花時(shí)間:1070
jdkCompre
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年大學(xué)試題(農(nóng)學(xué))-植物病理學(xué)歷年參考題庫(kù)含答案解析(5套典型考題)
- 2025年國(guó)家開(kāi)放大學(xué)(電大)-國(guó)家開(kāi)放大學(xué)(藥理學(xué))歷年參考題庫(kù)含答案解析(5套典型考題)
- 2025年衛(wèi)生資格(中初級(jí))-放射醫(yī)學(xué)技術(shù)(士)歷年參考題庫(kù)含答案解析(5套典型題)
- 2025年衛(wèi)生知識(shí)健康教育知識(shí)競(jìng)賽-居民健康素養(yǎng)知識(shí)競(jìng)賽歷年參考題庫(kù)含答案解析(5套典型考題)
- 2025年醫(yī)學(xué)高級(jí)職稱-疼痛診療學(xué)(醫(yī)學(xué)高級(jí))歷年參考題庫(kù)含答案解析(5套典型題)
- 2025年黨政知識(shí)干部培訓(xùn)知識(shí)競(jìng)賽-消防部隊(duì)干部競(jìng)爭(zhēng)上崗知識(shí)歷年參考題庫(kù)含答案解析(5套典型考題)
- 2025年企業(yè)文化企業(yè)建設(shè)知識(shí)競(jìng)賽-寶馬企業(yè)文化知識(shí)競(jìng)賽歷年參考題庫(kù)含答案解析(5套典型考題)
- 2025年業(yè)務(wù)知識(shí)崗位知識(shí)競(jìng)賽-手機(jī)終端業(yè)務(wù)知識(shí)競(jìng)賽歷年參考題庫(kù)含答案解析(5套典型考題)
- 2025年專業(yè)技術(shù)人員繼續(xù)教育公需科目-我國(guó)信息化發(fā)展進(jìn)入互聯(lián)網(wǎng)時(shí)代歷年參考題庫(kù)含答案解析(5套典型考題)
- 2024-2025學(xué)年滬科版八年級(jí)數(shù)學(xué)下學(xué)期期末模擬卷(拔尖卷)原卷版
- 卵胞質(zhì)內(nèi)單精子注射(ICSI)技術(shù)中國(guó)專家共識(shí)(2023年)版解讀課件
- 2025年上海市中考英語(yǔ)作文專項(xiàng)練習(xí)題+首字母高頻詞匯練習(xí)題(含答案)
- 藝術(shù)培訓(xùn)轉(zhuǎn)讓合同協(xié)議
- 炎德·英才大聯(lián)考雅禮中學(xué) 2025 屆模擬試卷(一)英語(yǔ)試題及答案
- 電力技術(shù)監(jiān)督專責(zé)人員上崗資格考試題庫(kù)汽輪機(jī)技術(shù)監(jiān)督分冊(cè)
- 業(yè)財(cái)融合效果評(píng)價(jià)體系指標(biāo)的構(gòu)建與優(yōu)化
- 貴州2025年01月2025年貴州省市兩級(jí)機(jī)關(guān)遴選公務(wù)員(451人)國(guó)家公務(wù)員考試消息筆試歷年典型考題(歷年真題考點(diǎn))解題思路附帶答案詳解
- 駕駛員職業(yè)健康培訓(xùn)內(nèi)容
- 2025年上半年廣東省廣州市工業(yè)和信息化委員會(huì)直屬事業(yè)單位選調(diào)工作人員1人易考易錯(cuò)模擬試題(共500題)試卷后附參考答案
- 農(nóng)業(yè)種植技術(shù)服務(wù)合同協(xié)議
- 2024年淮南市第一人民醫(yī)院西區(qū)高層次衛(wèi)技人才招聘筆試歷年參考題庫(kù)頻考點(diǎn)附帶答案
評(píng)論
0/150
提交評(píng)論