當前位置:編程學習大全網 - 源碼下載 - Js壓縮到指定大小-java如何實現壹個大尺寸壓縮到指定大小,長寬比不變?

Js壓縮到指定大小-java如何實現壹個大尺寸壓縮到指定大小,長寬比不變?

Js將圖片壓縮到固定像素以內,以500k為例。本文旨在探索js壓縮圖片的兩種方法:

更改圖片的長度和寬度

,

改變圖像質量

,以及以上兩者的組合

最終方案

首先,看這篇文章需要知道畫布的兩種方法。

這兩種方法的詳細描述可以在MDN上查看,也有很多現成的博客可以直接用在圖像壓縮上。但是那些博客有壹個問題,他們並不關心圖片後期的壓縮質量。

我試圖用壹個現成的例子來運行它。壹張1.7M的圖片壓縮到23k,是像素級的破壞。

如果大圖可能包含文字等大量關鍵信息,壹定要上傳後才能清晰識別。所以壓縮後的質量要盡可能接近500k,500k像素以內,也就是壹張圖片的寬度如果是1024,高度不能超過500。因為圖片有其他信息,所以也要占大小。也就是說,不超過

1024*500

所以根據需求,在上傳圖片不能超過500k K的情況下,盡量保持上傳圖片的清晰度,當然如果可能的話,盡量把上面說的壓縮程度設置為0.9和0.8。畫質尚可,尺寸會大大縮小。

如果不壓縮,如何通過調整圖片的長寬來控制上傳大小?

原理很簡單,就是通過不斷減小定義的最大寬度和高度,直到最終的長寬乘積小於指定的尺寸。

通過這種方法獲得的最終圖片的大小可能會略大於指定的大小。如上所述,如果妳想用這種方法,妳可以自己調整。

上面的方法有壹個問題,就是改變圖片原來的長度和寬度。如果壹張圖片的長寬足夠大,壓縮壹下畫質,稍微粘貼壹下也是可以的,但是內容可以看的很清楚。所以,和上面壹樣,我們可以不斷調整畫質設置,直到大小合適為止。那麽,在上傳之前,我們如何知道圖片的大小呢?

首先要知道壓縮後得到的base64字符串會被轉換成blob對象,然後傳遞給服務器。

可以查閱文檔,blob對象有壹個size屬性。

該大小是上傳後的實際文件大小。

參考以上思路,每次都可以更改(' image/'+fileType,level);Level值,來調整壓縮後的圖像質量,然後用blob對象的大小來驗證是否滿足500k K以內的要求。

關於等級是如何計算的,MDN文檔沒說什麽。它寫了壹個循環,壹次降級0.1,壓縮了幾張圖片。

經過加減乘除的計算,沒有找到規律,所以不能放棄數學(這個東西好像也不可觀測,結果和初始大小無關)。

這裏需要註意的是,可能會遇到非常大的畫面,0.1的級別可能不足以壓縮到500k,所以當小於0.1時,會通過改變級別的遞減差來繼續壓縮。

在妳開始接收圖片的時候給壹個加載增加用戶的耐心。裝載萬歲~

其實簡單的壓縮質量遇到稍微大壹點的圖片,會導致頁面的高頻計算,然後頁面基本就沒用了。我試著用了iphone的截圖(約10M)。過了壹會兒,整個手機都在燒,只殺了進程。

所以,如果對長度沒有特別的限制,可以做壹個縮放來加快壓縮進度,提高壓縮圖片的大小上限。

頁面在ios上還是不行——可以看到最後的畫面層次是0.001,最長邊是764。

問題是循環還是太多,計算頻率太高。從圖中可以看出,初始設置的級別和圖片大小對於大圖來說過於寬松,可以優化初始級別和大小。

有時候妳會遇到壹張無論如何也壓不到500k的圖,就是上次壓縮和這次壓縮後大小都沒變。這種情況需要拋出錯誤,防止循環繼續。

大圖等待時間稍長,用戶可以先預覽壹張base64圖片,增加耐心。這個方法叫做getImgBase64,在這裏給出。

待解決的隱患:會出現上面的方案。我需要壹張500k的照片,按到520k後,又按了壹次。有時候這最後壹次會特別誇張,直接把畫面弄到幾十k。

參考:

這個庫中有壹個叫compressAccurately的方法,可以壓縮的更精確。偷偷翻了源代碼。

事實上,最後壹種方案的痛點在於如何處理每個壓縮周期中的大小和壓縮比。

摘要

如有錯誤,請指正。

java如何將壹幅大圖壓縮成壹幅指定大小、長寬比相同的圖片?Java可以嘗試以下操作,將壹幅大圖壓縮成指定大小、長寬比相同的圖片:

創建壹個仿射變換。

仿射變換(doublem00,doublem10,doublem01,doublem11,doublem02,doublem12)

轉換矩陣,縮放比較簡單(矩陣可以做很多事情,想做圖像處理軟件可以研究壹下)

[x '][m00m 01m 02][x][m00x+m 01y+m02]

[y ']=[m 10m 11m 12][y]=[m 10x+m 11y+m 12]

[1][001][1][1]

10次很難計算(根號10,當然妳想算也可以),9次比較好(9的根是3),m00是1/3,m01是0,m02是0,m10是0,m65438是0。

構建另壹個AffineTransformOp並傳入上面的轉換。

affinitetransformop(affinitetransformxform,intinterpolationType)

最後調用AffineTransformOp的bufferedImagefilter(Bufferedimagesrc,Bufferedimagedst),src傳輸原圖。返回值是想要的圖像。註意是返回值,不是dst。如果妳不明白,妳可以看看JavaAPI。

java如何將壹幅大圖壓縮成壹幅指定大小、長寬比相同的圖片?Java可以嘗試以下操作,將壹幅大圖壓縮成指定大小、長寬比相同的圖片:

創建壹個仿射變換。

仿射變換(doublem00,doublem10,doublem01,doublem11,doublem02,doublem12)

轉換矩陣,縮放比較簡單(矩陣可以做很多事情,想做圖像處理軟件可以研究壹下)

[x '][m00m 01m 02][x][m00x+m 01y+m02]

[y ']=[m 10m 11m 12][y]=[m 10x+m 11y+m 12]

[1][001][1][1]

10次很難計算(根號10,當然妳想算也可以),9次比較好(9的根是3),m00是1/3,m01是0,m02是0,m10是0,m65438是0。

構建另壹個AffineTransformOp並傳入上面的轉換。

affinitetransformop(affinitetransformxform,intinterpolationType)

最後調用AffineTransformOp的bufferedImagefilter(Bufferedimagesrc,Bufferedimagedst),src傳輸原圖。返回值是想要的圖像。註意是返回值,不是dst。如果妳不明白,妳可以看看JavaAPI。

  • 上一篇:MapReduce之金庸的江湖人物分析項目
  • 下一篇:如何做壹個簡單的網頁簡單網頁設計
  • copyright 2024編程學習大全網