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)