/**
* 按尺寸质量压缩(测试)
* @param is
* @param to
* @param quality
* @throws IOException
*/
public static void compressQuality(InputStream is, File to, float quality, int maxWidth, int maxHeight) throws IOException{
//压缩大小
BufferedImage image = ImageIO.read(is);
if(image==null)return;
Integer width = image.getWidth();
Integer height = image.getHeight();
if(width>maxWidth || height>maxHeight){
ResampleOp resampleOp = new ResampleOp(DimensionConstrain.createMaxDimension(maxWidth, maxHeight));
image = resampleOp.filter(image, null);
}
// 得到指定Format图片的writer?
Iterator<ImageWriter> iter = ?ImageIO.getImageWritersByFormatName("jpeg");
ImageWriter imageWriter = iter.next();
?
// 得到指定writer的输出参数设置(ImageWriteParam ) ?
? ? ? ? ImageWriteParam iwp = imageWriter.getDefaultWriteParam(); ?
? ? ? ? iwp.setCompressionMode(ImageWriteParam.MODE_EXPLICIT); // 设置可否压缩 ?
? ? ? ? iwp.setCompressionQuality(quality); // 设置压缩质量参数 ?
? ? ? ? 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(); // 取得内存输出流 ?
? ? ? ? IIOImage iIamge = new IIOImage(image, null, null);?
? ? ? ??
? ? ? ? // 此处因为ImageWriter中用来接收write信息的output要求必须是ImageOutput ?
? ? ? ? // 通过ImageIo中的静态方法,得到byteArrayOutputStream的ImageOutput ?
? ? ? ? imageWriter.setOutput(ImageIO ?
? ? ? ? ? ? ? ? .createImageOutputStream(byteArrayOutputStream)); ?
? ? ? ? imageWriter.write(null, iIamge, iwp);?
? ? ? ??
? ? ? ? InputStream sbs = new ByteArrayInputStream(byteArrayOutputStream.toByteArray());
? ? ? ? ImageIO.write(ImageIO.read(sbs), "png", to);
? ? ? ??
}