java中实现无损压缩图片 直接上代码
方式一:压缩后生成base64或写出图片
public static void compressPicByQuality(String filePath, float quality) {
BufferedImage image= ImageIO.read(new File(filePath));
try {
Iterator<ImageWriter> iter = ImageIO.getImageWritersByFormatName("jpg");
ImageWriter writer = (ImageWriter) iter.next();
ImageWriteParam iwp = writer.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)));
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
IIOImage iIamge = new IIOImage(image, null, null);
writer.setOutput(ImageIO.createImageOutputStream(byteArrayOutputStream));
writer.write(null, iIamge, iwp);
byte[] imgBytes = byteArrayOutputStream.toByteArray();
String base64Str = Base64.encodeToString(imgBytes);
} catch (IOException e) {
e.printStackTrace();
}
}
方式二:压缩后覆盖原图
private static void doWithPhoto(String path) {
File file = new File(path);
if (!file.exists()) {
return;
}
BufferedImage image = null;
FileOutputStream os = null;
try {
image = ImageIO.read(file);
int width = image.getWidth();
int height = image.getHeight();
BufferedImage bfImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
bfImage.getGraphics().drawImage(image.getScaledInstance(width, height, Image.SCALE_SMOOTH), 0, 0, null);
os = new FileOutputStream(path);
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(os);
encoder.encode(bfImage);
} catch (IOException e) {
e.printStackTrace();
} finally {
if (os != null) {
try {
os.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}