java圖片壓縮前后臺(tái)方法整理

根據(jù)項(xiàng)目需求整理了一下圖片壓縮的方法;

1况褪、前端js壓縮,base64壓縮

function dealImage(base64, w, callback) {

var newImage = new Image();

var quality = 0.6;? ? //壓縮系數(shù)0-1之間

newImage.src = base64;

newImage.setAttribute("crossOrigin", 'Anonymous'); //url為外域時(shí)需要

var imgWidth, imgHeight;

newImage.onload = function () {

imgWidth = this.width;

imgHeight = this.height;

var canvas = document.createElement("canvas");

var ctx = canvas.getContext("2d");

if (Math.max(imgWidth, imgHeight) > w) {

if (imgWidth > imgHeight) {

canvas.width = w;

canvas.height = w * imgHeight / imgWidth;

} else {

canvas.height = w;

canvas.width = w * imgWidth / imgHeight;

}

} else {

canvas.width = imgWidth;

canvas.height = imgHeight;

quality = 0.6;

}

ctx.clearRect(0, 0, canvas.width, canvas.height);

ctx.drawImage(this, 0, 0, canvas.width, canvas.height);

var base64 = canvas.toDataURL("image/jpeg", quality); //壓縮語(yǔ)句

// 如想確保圖片壓縮到自己想要的尺寸,如要求在50-150kb之間,請(qǐng)加以下語(yǔ)句碎罚,quality初始值根據(jù)情況自定

// while (base64.length / 1024 > 150) {

// quality -= 0.01;

// base64 = canvas.toDataURL("image/jpeg", quality);

// }

// 防止最后一次壓縮低于最低尺寸会傲,只要quality遞減合理锅棕,無(wú)需考慮

// while (base64.length / 1024 < 50) {

// quality += 0.001;

// base64 = canvas.toDataURL("image/jpeg", quality);

// }

callback(base64);//必須通過(guò)回調(diào)函數(shù)返回,否則無(wú)法及時(shí)拿到該值

}

}

//使用壓縮

dealImage(oldBase64, 800, printing);

function printing(base64) {

console.log("壓縮后", base64.length / 1024)

}

2淌山、后臺(tái)base64壓縮

import com.sun.syndication.io.impl.Base64;

import net.coobird.thumbnailator.Thumbnails;

import net.coobird.thumbnailator.geometry.Positions;

import sun.misc.BASE64Decoder;

public static String resizeImageTo40K(String base64Img) {

? ? ? ? try {

? ? ? ? ? ? BufferedImage src = base64String2BufferedImage(base64Img);

? ? ? ? ? ? BufferedImage output = Thumbnails.of(src).size(src.getWidth()/3, src.getHeight()/3).asBufferedImage();

? ? ? ? ? ? String base64 = imageToBase64(output);

? ? ? ? ? ? if (base64.length() - base64.length() / 8 * 2 > 40000) {

? ? ? ? ? ? ? ? output = Thumbnails.of(output).scale(1/(base64.length()/40000)).asBufferedImage();

? ? ? ? ? ? ? ? base64 = imageToBase64(output);

? ? ? ? ? ? }

? ? ? ? ? ? return base64;

? ? ? ? } catch (Exception e) {

? ? ? ? ? ? return base64Img;

? ? ? ? }

? ? }

? ? public static BufferedImage base64String2BufferedImage(String base64string) {

? ? ? ? BufferedImage image = null;

? ? ? ? try {

? ? ? ? ? ? InputStream stream = BaseToInputStream(base64string);

? ? ? ? ? ? image = ImageIO.read(stream);

? ? ? ? } catch (IOException e) {

// ? ? ? ? ? ? LOG.info("");

? ? ? ? }

? ? ? ? return image;

? ? }

? ? public static String imageToBase64(BufferedImage bufferedImage) {

? ? ? ? Base64 encoder = new Base64();

? ? ? ? ByteArrayOutputStream baos = new ByteArrayOutputStream();

? ? ? ? try {

? ? ? ? ? ? ImageIO.write(bufferedImage, "jpg", baos);

? ? ? ? } catch (IOException e) {

// ? ? ? ? ? ? LOG.info("");

? ? ? ? System.out.println(e);

? ? ? ? }

? ? ? ? return new String(encoder.encode((baos.toByteArray())));

? ? }

? ? private static InputStream BaseToInputStream(String base64string){

? ? ? ? ByteArrayInputStream stream = null;

? ? ? ? try {

? ? ? ? ? ? BASE64Decoder decoder = new BASE64Decoder();

? ? ? ? ? ? byte[] bytes1 = decoder.decodeBuffer(base64string);

? ? ? ? ? ? stream = new ByteArrayInputStream(bytes1);

? ? ? ? } catch (Exception e) {

? ? ? ? ? ? // TODO: handle exception

? ? ? ? }

? ? ? ? return stream;

? ? }

? ? //base64壓縮

? ? public static void main(String[] args){

? ? ? ? String base64="";

? ? ? ? String s=resizeImageTo40K(base64);

? ? ? ? System.out.println(s);

? ? }

3裸燎、后臺(tái)java 路徑壓縮;

public class ThumbnailatorTest {

? ? /**

? ? *

? ? * @param args

? ? * @throws IOException

? ? */

// ? ? public static void main(String[] args) throws IOException {

// ? ? ? ? ThumbnailatorTest thumbnailatorTest = new ThumbnailatorTest();

//// ? ? ? ? thumbnailatorTest.test1();

//// ? ? ? ? thumbnailatorTest.test2();

//// ? ? ? ? thumbnailatorTest.test3();

//// ? ? ? ? thumbnailatorTest.test4();

//// ? ? ? ? thumbnailatorTest.test5();

//// ? ? ? ? thumbnailatorTest.test6();

//// ? ? ? ? thumbnailatorTest.test7();

//// ? ? ? ? thumbnailatorTest.test8();

//// ? ? ? ? thumbnailatorTest.test9();

// ? ? }

? ? /**

? ? * 指定大小進(jìn)行縮放

? ? *

? ? * @throws IOException

? ? */

? ? private void test1() throws IOException {

? ? ? ? /*

? ? ? ? * size(width,height) 若圖片橫比200小泼疑,高比300小德绿,不變

? ? ? ? * 若圖片橫比200小,高比300大退渗,高縮小到300移稳,圖片比例不變 若圖片橫比200大,高比300小会油,橫縮小到200个粱,圖片比例不變

? ? ? ? * 若圖片橫比200大,高比300大钞啸,圖片按比例縮小几蜻,橫為200或高為300

? ? ? ? */

? ? ? ? Thumbnails.of("C:\\Users\\Administrator\\Downloads\\www.jpg").size(200, 300).toFile("C:\\Users\\Administrator\\Desktop\\www_200x300.jpg");

// ? ? ? ? Thumbnails.of("C:\\Users\\Administrator\\Desktop\\02e853da68681e43fe198c99280861ef.jpg").size(2560, 2048).toFile("C:/image_2560x2048.jpg");

? ? }

? ? /**

? ? * 按照比例進(jìn)行縮放

? ? *

? ? * @throws IOException

? ? */

? ? private void test2() throws IOException {

? ? ? ? /**

? ? ? ? * scale(比例)

? ? ? ? */

? ? ? ? Thumbnails.of("C:\\Users\\Administrator\\Desktop\\02e853da68681e43fe198c99280861ef.jpg").scale(0.25f).toFile("C:\\Users\\Administrator\\Desktop\\image_25%.jpg");

// ? ? ? ? Thumbnails.of("images/test.jpg").scale(1.10f).toFile("C:/image_110%.jpg");

? ? }

? ? /**

? ? * 不按照比例喇潘,指定大小進(jìn)行縮放

? ? *

? ? * @throws IOException

? ? */

? ? private void test3() throws IOException {

? ? ? ? /**

? ? ? ? * keepAspectRatio(false) 默認(rèn)是按照比例縮放的

? ? ? ? */

? ? ? ? Thumbnails.of("C:\\Users\\Administrator\\Desktop\\02e853da68681e43fe198c99280861ef.jpg").size(120, 120).keepAspectRatio(false).toFile("C:\\Users\\Administrator\\Desktop\\image_120x120.jpg");

? ? }

? ? /**

? ? * 旋轉(zhuǎn)

? ? *

? ? * @throws IOException

? ? */

? ? private void test4() throws IOException {

? ? ? ? /**

? ? ? ? * rotate(角度),正數(shù):順時(shí)針 負(fù)數(shù):逆時(shí)針

? ? ? ? */

? ? ? ? Thumbnails.of("images/test.jpg").size(1280, 1024).rotate(90).toFile("C:/image+90.jpg");

? ? ? ? Thumbnails.of("images/test.jpg").size(1280, 1024).rotate(-90).toFile("C:/iamge-90.jpg");

? ? }

? ? /**

? ? * 水印

? ? *

? ? * @throws IOException

? ? */

? ? private void test5() throws IOException {

? ? ? ? /**

? ? ? ? * watermark(位置,水印圖梭稚,透明度)

? ? ? ? */

? ? ? ? Thumbnails.of("images/test.jpg").size(1280, 1024).watermark(Positions.BOTTOM_RIGHT, ImageIO.read(new File("images/watermark.png")), 0.5f)

? ? ? ? ? ? ? ? .outputQuality(0.8f).toFile("C:/image_watermark_bottom_right.jpg");

? ? ? ? Thumbnails.of("images/test.jpg").size(1280, 1024).watermark(Positions.CENTER, ImageIO.read(new File("images/watermark.png")), 0.5f)

? ? ? ? ? ? ? ? .outputQuality(0.8f).toFile("C:/image_watermark_center.jpg");

? ? }

? ? /**

? ? * 裁剪

? ? *

? ? * @throws IOException

? ? */

? ? private void test6() throws IOException {

? ? ? ? /**

? ? ? ? * 圖片中心400*400的區(qū)域

? ? ? ? */

? ? ? ? Thumbnails.of("images/test.jpg").sourceRegion(Positions.CENTER, 400, 400).size(200, 200).keepAspectRatio(false)

? ? ? ? ? ? ? ? .toFile("C:/image_region_center.jpg");

? ? ? ? /**

? ? ? ? * 圖片右下400*400的區(qū)域

? ? ? ? */

? ? ? ? Thumbnails.of("images/test.jpg").sourceRegion(Positions.BOTTOM_RIGHT, 400, 400).size(200, 200).keepAspectRatio(false)

? ? ? ? ? ? ? ? .toFile("C:/image_region_bootom_right.jpg");

? ? ? ? /**

? ? ? ? * 指定坐標(biāo)

? ? ? ? */

? ? ? ? Thumbnails.of("images/test.jpg").sourceRegion(600, 500, 400, 400).size(200, 200).keepAspectRatio(false).toFile("C:/image_region_coord.jpg");

? ? }

? ? /**

? ? * 轉(zhuǎn)化圖像格式

? ? *

? ? * @throws IOException

? ? */

? ? private void test7() throws IOException {

? ? ? ? /**

? ? ? ? * outputFormat(圖像格式)

? ? ? ? */

? ? ? ? Thumbnails.of("images/test.jpg").size(1280, 1024).outputFormat("png").toFile("C:/image_1280x1024.png");

? ? ? ? Thumbnails.of("images/test.jpg").size(1280, 1024).outputFormat("gif").toFile("C:/image_1280x1024.gif");

? ? }

? ? /**

? ? * 輸出到OutputStream

? ? *

? ? * @throws IOException

? ? */

? ? private void test8() throws IOException {

? ? ? ? /**

? ? ? ? * toOutputStream(流對(duì)象)

? ? ? ? */

? ? ? ? OutputStream os = new FileOutputStream("C:/image_1280x1024_OutputStream.png");

? ? ? ? Thumbnails.of("images/test.jpg").size(1280, 1024).toOutputStream(os);

? ? }

? ? /**

? ? * 輸出到BufferedImage

? ? *

? ? * @throws IOException

? ? */

? ? private void test9() throws IOException {

? ? ? ? /**

? ? ? ? * asBufferedImage() 返回BufferedImage

? ? ? ? */

? ? ? ? BufferedImage thumbnail = Thumbnails.of("images/test.jpg").size(1280, 1024).asBufferedImage();

? ? ? ? ImageIO.write(thumbnail, "jpg", new File("C:/image_1280x1024_BufferedImage.jpg"));

? ? }

注:谷歌壓縮方法其中有個(gè)bug颖低,基于ps 格式圖片會(huì)有轉(zhuǎn)換問(wèn)題,需要導(dǎo)入其中包弧烤,代碼無(wú)需修改:


jar包下載可以從:https://mvnrepository.com/

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末忱屑,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子暇昂,更是在濱河造成了極大的恐慌莺戒,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,427評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件急波,死亡現(xiàn)場(chǎng)離奇詭異从铲,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)澄暮,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)名段,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人泣懊,你說(shuō)我怎么就攤上這事伸辟。” “怎么了馍刮?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,747評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵信夫,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我卡啰,道長(zhǎng)静稻,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,939評(píng)論 1 295
  • 正文 為了忘掉前任碎乃,我火速辦了婚禮姊扔,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘梅誓。我一直安慰自己恰梢,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,955評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布梗掰。 她就那樣靜靜地躺著嵌言,像睡著了一般。 火紅的嫁衣襯著肌膚如雪及穗。 梳的紋絲不亂的頭發(fā)上摧茴,一...
    開(kāi)封第一講書(shū)人閱讀 51,737評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音埂陆,去河邊找鬼苛白。 笑死娃豹,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的购裙。 我是一名探鬼主播懂版,決...
    沈念sama閱讀 40,448評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼躏率!你這毒婦竟也來(lái)了躯畴?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,352評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤薇芝,失蹤者是張志新(化名)和其女友劉穎蓬抄,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體夯到,經(jīng)...
    沈念sama閱讀 45,834評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡嚷缭,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,992評(píng)論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了黄娘。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片峭状。...
    茶點(diǎn)故事閱讀 40,133評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡克滴,死狀恐怖逼争,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情劝赔,我是刑警寧澤誓焦,帶...
    沈念sama閱讀 35,815評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站着帽,受9級(jí)特大地震影響杂伟,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜仍翰,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,477評(píng)論 3 331
  • 文/蒙蒙 一赫粥、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧予借,春花似錦越平、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,022評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至瀑粥,卻和暖如春挣跋,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背狞换。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,147評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工避咆, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留舟肉,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,398評(píng)論 3 373
  • 正文 我出身青樓查库,卻偏偏與公主長(zhǎng)得像度气,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子膨报,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,077評(píng)論 2 355