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

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

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

1.BufferedImage來處理

? ? 1.1 質(zhì)量壓縮

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

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

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

// 指定壓縮時(shí)使用的色彩模式
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);

// 此處因?yàn)镮mageWriter中用來接收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;
? ? //定義的基準(zhǔn)為4K
? ? BigDecimal bignum1 =new BigDecimal("4000");
? ? //獲取相對應(yīng)的比例
? ? 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);
????}

? ? //縮小相應(yīng)的比例
?????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();

備注:讀取文件流時(shí),使用thumbnailator 時(shí)部分圖片拋異常(因此推薦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)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容