2.Java 圖片質量壓縮與圖片縮放

Java 圖片壓縮:像素質量壓縮 提鸟、圖片長寬縮放朦前。常用方式:一種為Java有BufferedImage來處理祈餐;另一種為谷歌的Thumbnailator處理辨宠。如果為文件流處理圖片的時候,推薦使用第一種琳省;如果

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

1.BufferedImage來處理

? ? 1.1 質量壓縮

//讀取圖片文件流
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); // 設置壓縮質量參數(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 質量壓縮?

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

? ???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)

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末桦他,一起剝皮案震驚了整個濱河市蔫巩,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌快压,老刑警劉巖圆仔,帶你破解...
    沈念sama閱讀 221,430評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異蔫劣,居然都是意外死亡坪郭,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,406評論 3 398
  • 文/潘曉璐 我一進店門脉幢,熙熙樓的掌柜王于貴愁眉苦臉地迎上來歪沃,“玉大人嗦锐,你說我怎么就攤上這事』κ铮” “怎么了奕污?”我有些...
    開封第一講書人閱讀 167,834評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長珊蟀。 經(jīng)常有香客問我菊值,道長,這世上最難降的妖魔是什么育灸? 我笑而不...
    開封第一講書人閱讀 59,543評論 1 296
  • 正文 為了忘掉前任腻窒,我火速辦了婚禮,結果婚禮上磅崭,老公的妹妹穿的比我還像新娘儿子。我一直安慰自己,他們只是感情好砸喻,可當我...
    茶點故事閱讀 68,547評論 6 397
  • 文/花漫 我一把揭開白布柔逼。 她就那樣靜靜地躺著,像睡著了一般割岛。 火紅的嫁衣襯著肌膚如雪愉适。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,196評論 1 308
  • 那天癣漆,我揣著相機與錄音维咸,去河邊找鬼。 笑死惠爽,一個胖子當著我的面吹牛癌蓖,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播婚肆,決...
    沈念sama閱讀 40,776評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼租副,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了较性?” 一聲冷哼從身側響起用僧,我...
    開封第一講書人閱讀 39,671評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎赞咙,沒想到半個月后永毅,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,221評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡人弓,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,303評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了着逐。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片崔赌。...
    茶點故事閱讀 40,444評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡意蛀,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出健芭,到底是詐尸還是另有隱情县钥,我是刑警寧澤,帶...
    沈念sama閱讀 36,134評論 5 350
  • 正文 年R本政府宣布慈迈,位于F島的核電站若贮,受9級特大地震影響,放射性物質發(fā)生泄漏痒留。R本人自食惡果不足惜谴麦,卻給世界環(huán)境...
    茶點故事閱讀 41,810評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望伸头。 院中可真熱鬧匾效,春花似錦、人聲如沸恤磷。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,285評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽扫步。三九已至魔策,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間河胎,已是汗流浹背闯袒。 一陣腳步聲響...
    開封第一講書人閱讀 33,399評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留仿粹,地道東北人搁吓。 一個月前我還...
    沈念sama閱讀 48,837評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像吭历,于是被迫代替她去往敵國和親堕仔。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,455評論 2 359