久久久久久久视色,久久电影免费精品,中文亚洲欧美乱码在线观看,在线免费播放AV片

<center id="vfaef"><input id="vfaef"><table id="vfaef"></table></input></center>

    <p id="vfaef"><kbd id="vfaef"></kbd></p>

    
    
    <pre id="vfaef"><u id="vfaef"></u></pre>

      <thead id="vfaef"><input id="vfaef"></input></thead>

    1. 站長資訊網(wǎng)
      最全最豐富的資訊網(wǎng)站

      java實例解析之1M圖片壓縮優(yōu)化到100kb

      本篇文章給大家?guī)砹岁P(guān)于java的相關(guān)知識,主要為大家介紹了java實現(xiàn)1M圖片壓縮優(yōu)化到100kb示例詳解,圖像壓縮是數(shù)據(jù)壓縮技術(shù)在數(shù)字圖像上的應(yīng)用,有需要的朋友可以借鑒參考下,希望能夠有所幫助。

      java實例解析之1M圖片壓縮優(yōu)化到100kb

      推薦學(xué)習(xí):《java視頻教程》

      一、圖像壓縮

      圖像壓縮是數(shù)據(jù)壓縮技術(shù)在數(shù)字圖像上的應(yīng)用,目的是減少圖像數(shù)據(jù)中的冗余信息,從而用更加高效的格式存儲和傳輸數(shù)據(jù)。

      圖像壓縮可以是有損數(shù)據(jù)壓縮,也可以是無損數(shù)據(jù)壓縮。

      java實例解析之1M圖片壓縮優(yōu)化到100kb

      java實例解析之1M圖片壓縮優(yōu)化到100kb

      怎么樣?

      是不是感覺圖像壓縮技術(shù)沒有想象中那么簡單了?

      二、Java數(shù)字圖像處理

      作為這次“20 多萬外包項目”的“主力開發(fā)人員”,我這里就給大家介紹下 Java 數(shù)字圖像處理技術(shù)吧,一開始我就是用它來處理圖片的。

      數(shù)字圖像處理(Digital Image Processing)是通過計算機對圖像進行去除噪聲、增強、復(fù)原、分割、提取特征等處理的方法和技術(shù)。

      java實例解析之1M圖片壓縮優(yōu)化到100kb

      輸入的是圖像信號,然后經(jīng)過 DIP 進行有效的算法處理后,輸出為數(shù)字信號。

      為了壓縮圖像,我們需要讀取圖像并將其轉(zhuǎn)換成 BufferedImage 對象,BufferedImage 是 Image 類的一個子類,描述了一個具有可訪問的圖像數(shù)據(jù)緩沖區(qū),由 ColorModel 和 Raster 的圖像數(shù)據(jù)組成。

      java實例解析之1M圖片壓縮優(yōu)化到100kb

      廢話我就不多說了,直接進入實戰(zhàn)吧!

      三、圖像壓縮實戰(zhàn)

      剛好我本地有一張之前用過的封面圖,離 1M 只差 236 KB,可以拿來作為測試用。

      java實例解析之1M圖片壓縮優(yōu)化到100kb

      這其中要用到 ImageIO 類,這是一個靜態(tài)類,提供了一系列方法用來讀和寫圖像,同時還可以對圖像進行簡單的編碼和解碼。

      比如說通過 ImageIO.read() 可以將圖像讀取到 BufferedImage 對象:

      File input = new File("ceshi.jpg"); BufferedImage image = ImageIO.read(input);

      比如說通過 ImageIO.getImageWritersByFormatName() 可以返回一個Iterator,其中包含了通過命名格式對圖像進行編碼的 ImageWriter。

      Iterator&lt;ImageWriter&gt; writers =  ImageIO.getImageWritersByFormatName("jpg"); ImageWriter writer = (ImageWriter) writers.next();

      比如說通過 ImageIO.createImageOutputStream() 可以創(chuàng)建一個圖像的輸出流對象,有了該對象后就可以通過 ImageWriter.setOutput() 將其設(shè)置為輸出流。

      File compressedImageFile = new File("bbcompress.jpg"); OutputStream os =new FileOutputStream(compressedImageFile); ImageOutputStream ios = ImageIO.createImageOutputStream(os); writer.setOutput(ios);

      緊接著,可以對 ImageWriter 進行一些參數(shù)配置,比如說壓縮模式,壓縮質(zhì)量等等。

      ImageWriteParam param = writer.getDefaultWriteParam(); param.setCompressionMode(ImageWriteParam.MODE_EXPLICIT); param.setCompressionQuality(0.01f);

      壓縮模式一共有四種,MODE_EXPLICIT 是其中一種,表示 ImageWriter 可以根據(jù)后續(xù)的 set 的附加信息進行平鋪和壓縮,比如說接下來的 setCompressionQuality() 方法。

      setCompressionQuality() 方法的參數(shù)是一個 0-1 之間的數(shù),0.0 表示盡最大程度壓縮,1.0 表示保證圖像質(zhì)量很重要。對于有損壓縮方案,壓縮質(zhì)量應(yīng)該控制文件大小和圖像質(zhì)量之間的權(quán)衡(例如,通過在寫入 JPEG 圖像時選擇量化表)。 對于無損方案,壓縮質(zhì)量可用于控制文件大小和執(zhí)行壓縮所需的時間之間的權(quán)衡(例如,通過優(yōu)化行過濾器并在寫入 PNG 圖像時設(shè)置 ZLIB 壓縮級別)。

      整體代碼如下所示:

      public class Demo {     public static void main(String[] args) {         try {             File input = new File("ceshi.jpg");             BufferedImage image = ImageIO.read(input);             Iterator&lt;ImageWriter&gt; writers = ImageIO.getImageWritersByFormatName("jpg");             ImageWriter writer = (ImageWriter) writers.next();             File compressedImageFile = new File("bbcompress.jpg");             OutputStream os = new FileOutputStream(compressedImageFile);             ImageOutputStream ios = ImageIO.createImageOutputStream(os);             writer.setOutput(ios);             ImageWriteParam param = writer.getDefaultWriteParam();             param.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);             param.setCompressionQuality(0.01f);             writer.write(null, new IIOImage(image, null, null), param);             os.close();             ios.close();             writer.dispose();         } catch (IOException e) {             e.printStackTrace();         }     } }

      執(zhí)行壓縮后,可以看到圖片的大小壓縮到了 19 KB:

      java實例解析之1M圖片壓縮優(yōu)化到100kb

      可以看得出,質(zhì)量因子為 0.01f 的時候圖片已經(jīng)有些失真了,可以適當(dāng)提高質(zhì)量因子比如說 0.5f,再來看一下。

      java實例解析之1M圖片壓縮優(yōu)化到100kb

      圖片質(zhì)量明顯提高了,但大小依然只有 64 KB,壓縮效果還是值得信賴的。

      四、其他開源庫

      接下來,推薦一些可以輕松集成到項目中的圖像處理庫吧,它們?nèi)际敲赓M的。

      1)ImageJ,用 Java 編寫的,可以編輯、分析、處理、保存和打印圖像。

      java實例解析之1M圖片壓縮優(yōu)化到100kb

      2)Apache Commons Imaging,一個讀取和寫入各種圖像格式的庫,包括快速解析圖像信息(如大小,顏色,空間,ICC配置文件等)和元數(shù)據(jù)。

      java實例解析之1M圖片壓縮優(yōu)化到100kb

      3)ImageMagick,可以讀取和寫入超過100種格式的圖像,包括DPX、EXR、GIF、JPEG、JPEG-2000、PDF、PNG、Postscript、SVG和TIFF。還可以調(diào)整大小、翻轉(zhuǎn)、鏡像、旋轉(zhuǎn)、扭曲、剪切和變換圖像,調(diào)整圖像顏色,應(yīng)用各種特殊效果,包括繪制文本、線條、多邊形、橢圓和貝塞爾曲線。

      java實例解析之1M圖片壓縮優(yōu)化到100kb

      4)OpenCV,由BSD許可證發(fā)布,可以免費學(xué)習(xí)和商業(yè)使用,提供了包括 C/C++、Python 和 Java 等主流編程語言在內(nèi)的接口。OpenCV 專為計算效率而設(shè)計,強調(diào)實時應(yīng)用,可以充分發(fā)揮多核處理器的優(yōu)勢。

      java實例解析之1M圖片壓縮優(yōu)化到100kb

      這里就以 OpenCV 為例,來演示一下圖像壓縮。當(dāng)然了,OpenCV 用來壓縮圖像屬于典型的大材小用。

      第一步,添加 OpenCV 依賴到我們的項目當(dāng)中,以 Maven 為例。

      <dependency> 	<groupId>org.openpnp</groupId> 	<artifactId>opencv</artifactId> 	<version>4.5.1-2</version> </dependency>

      第二步,要想使用 OpenCV,需要先初始化。

      OpenCV.loadShared();

      第三步,使用 OpenCV 讀取圖片。

      Mat src = Imgcodecs.imread(imagePath);

      第四步,使用 OpenCV 壓縮圖片。

      MatOfInt dstImage = new MatOfInt(Imgcodecs.IMWRITE_JPEG_QUALITY, 1); Imgcodecs.imwrite("resized_image.jpg", sourceImage, dstImage);

      MatOfInt 的構(gòu)造參數(shù)是一個可變參數(shù),第一個參數(shù) IMWRITE_JPEG_QUALITY 表示對圖片的質(zhì)量進行改變,第二個是質(zhì)量因子,1-100,值越大表示質(zhì)量越高。

      執(zhí)行代碼后得到的圖片如下所示:

      java實例解析之1M圖片壓縮優(yōu)化到100kb

      借這個機會,來對比下 OpenCV 和 JDK 原生 API 在壓縮圖像時所使用的時間。

      這是我本機的配置情況,早年買的頂配 iMac,也是我的主力機。一開始只有 16 G 內(nèi)存,后來加了一個 16 G 內(nèi)存條,不過最近半年電腦突然死機重啟的頻率明顯提高了,不知道是不是 Big Sur 這個操作系統(tǒng)的問題還是電腦硬件老了。

      java實例解析之1M圖片壓縮優(yōu)化到100kb

      結(jié)果如下所示:

      opencvCompress壓縮完成,所花時間:1070
      jdkCompress壓縮完成,所花時間:322

      壓縮后的圖片大小差不多,都是 19 KB,并且質(zhì)量因子都是最低值。

      java實例解析之1M圖片壓縮優(yōu)化到100kb

      推薦學(xué)習(xí):《java視頻教程》

      贊(0)
      分享到: 更多 (0)
      網(wǎng)站地圖   滬ICP備18035694號-2    滬公網(wǎng)安備31011702889846號