2.Java 圖片質(zhì)量壓縮與圖片縮放

Java 圖片壓縮:像素質(zhì)量壓縮 、圖片長寬縮放。常用方式:一種為Java有BufferedImage來處理;另一種為谷歌的Thumbnailator處理。如果為文件流處理圖片的時候,推薦使用第一種;如果

路徑讀取文件,推薦選擇第二種。

1.BufferedImage來處理

? ? 1.1 質(zhì)量壓縮

//讀取圖片文件流
BufferedImage image = ImageIO.read(inputStream);

// 得到指定Format圖片的writer
Iterator iter = ImageIO.getImageWritersByFormatName("JPEG");
ImageWriter imageWriter = iter.next();

// 得到指定writer的輸出參數(shù)設置(ImageWriteParam )
ImageWriteParam iwp = imageWriter.getDefaultWriteParam();
iwp.setCompressionMode(ImageWriteParam.MODE_EXPLICIT); // 設置可否壓縮iwp.setCompressionQuality(2000000); // 設置壓縮質(zhì)量參數(shù)iwp.setProgressiveMode(ImageWriteParam.MODE_DISABLED);
ColorModel colorModel = ColorModel.getRGBdefault();

// 指定壓縮時使用的色彩模式
iwp.setDestinationType(new javax.imageio.ImageTypeSpecifier(colorModel,
colorModel.createCompatibleSampleModel(16, 16)));

// 開始打包圖片,寫入byte[]
ByteArrayOutputStream byteArrayOutputStream =new ByteArrayOutputStream(); // 取得內(nèi)存輸出流
IIOImage iIamge =new IIOImage(image, null, null);

// 此處因為ImageWriter中用來接收write信息的output要求必須是ImageOutput
// 通過ImageIo中的靜態(tài)方法,得到byteArrayOutputStream的ImageOutput
imageWriter.setOutput(ImageIO.createImageOutputStream(byteArrayOutputStream));
imageWriter.write(null, iIamge, iwp);

InputStream sbs =new ByteArrayInputStream(byteArrayOutputStream.toByteArray());

//輸入文件流
ByteArrayOutputStream outStream = new ByteArrayOutputStream();
ImageIO.write(ImageIO.read(sbs), "JPEG", outStream);
return outStream.toByteArray();?

? ??1.2 圖片長寬縮放

//讀取圖片文件流
BufferedImage image = ImageIO.read(inputStream);
int width = image.getWidth(); int height = image.getHeight();?
//判斷圖片的擺放位置(橫向圖片 縱向圖片)
if(width >4000? || height >4000){
????BigDecimal value;
? ? //定義的基準為4K
? ? BigDecimal bignum1 =new BigDecimal("4000");
? ? //獲取相對應的比例
? ? if(image.getWidth() > image.getHeight()){
? ? ? ? BigDecimal bignum2 =new BigDecimal(image.getWidth());
? ? ? ? value = bignum1.divide(bignum2, 2);
????}else{
????????BigDecimal bignum2 =new BigDecimal(image.getHeight());
? ? ? ? value = bignum1.divide(bignum2, 2);
????}

? ? //縮小相應的比例
?????if(value.doubleValue() <1){
????????width =new BigDecimal(image.getWidth()).multiply(value).intValue();
????????height =new BigDecimal(image.getHeight()).multiply(value).intValue();
? ? ? ? //重繪圖片
????????BufferedImage imageNew =new BufferedImage(width, ????????????????height,BufferedImage.TYPE_INT_RGB);

? ? ? ? imageNew.getGraphics().drawImage(image, 0, 0, width, height, null); // 繪制縮小后的圖

? ? ? ? ByteArrayOutputStream outStream =new ByteArrayOutputStream(); ????????ImageIO.write(imageNew, "JPEG", outStream);
????????//把outStream里的數(shù)據(jù)寫入內(nèi)存
????????return outStream.toByteArray();
?}

2.Thumbnailator處理

? ? 2.1 質(zhì)量壓縮?

? ??Thumbnails.of(path).scale(1f).outputQuality(0.25f).toFile(toPic);
? ??outputQuality就是用來控制圖片質(zhì)量的

? ???2.2?圖片長寬縮放?

ByteArrayOutputStream out = new ByteArrayOutputStream();
Thumbnails.of(path).size(ppi, ppi).outputFormat("png").toOutputStream(out);
return? out.toByteArray();

備注:讀取文件流時,使用thumbnailator 時部分圖片拋異常(因此推薦Java BufferedImage)

net.coobird.thumbnailator.tasks.UnsupportedFormatException: No suitable ImageReader foundfor source data.

? ? at net.coobird.thumbnailator.tasks.io.InputStreamImageSource.read(Unknown Source)

? ? at net.coobird.thumbnailator.tasks.SourceSinkThumbnailTask.read(Unknown Source)

? ? at net.coobird.thumbnailator.Thumbnailator.createThumbnail(Unknown Source)

? ? at net.coobird.thumbnailator.Thumbnails$Builder.toOutputStream(Unknown Source)

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,156評論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,401評論 3 415
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,069評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,873評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,635評論 6 408
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,128評論 1 323
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,203評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,365評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,881評論 1 334
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 40,733評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,935評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,475評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,172評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,582評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,821評論 1 282
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,595評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,908評論 2 372