java实现图片压缩
程序员文章站
2022-07-10 20:23:14
...
使用java压缩图片大小
```java package com.study.testImg;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Transparency;
import java.awt.geom.AffineTransform;
import java.awt.image.AffineTransformOp;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import org.apache.commons.lang3.StringUtils;
public class ChangeImg {
public static void main(String[] args) throws IOException {
int newWidth = 360;
int newHeight = 270;
File imageFile = new File("C:\\Users\\yanlei\\Desktop\\图片\\2999300001-20200910152903-cc8201d173f04c66bae3e6f7ce32ca45-000.jpeg");
String newPath = "C:\\Users\\yanlei\\Desktop\\图片\\缩放\\zoomImageScale.jpeg";
zoomImageScale(imageFile, newPath, newWidth);
newPath = "C:\\Users\\yanlei\\Desktop\\图片\\缩放\\constrainProportios.jpeg";
constrainProportios(imageFile, newPath, newWidth);
newPath = "C:\\Users\\yanlei\\Desktop\\图片\\缩放\\zoomImage.jpeg";
zoomImage(imageFile, newPath, newWidth, newHeight);
}
/**
* 按指定宽度 等比例缩放图片
*
* @param imageFile
* @param newPath
* @param newWidth
* 新图的宽度
* @throws IOException
*/
public static void zoomImageScale(File imageFile, String newPath, int newWidth) throws IOException {
if (!imageFile.canRead())
return;
BufferedImage bufferedImage = ImageIO.read(imageFile);
if (null == bufferedImage)
return;
int originalWidth = bufferedImage.getWidth();
int originalHeight = bufferedImage.getHeight();
double scale = (double) originalWidth / (double) newWidth; // 缩放的比例
int newHeight = (int) (originalHeight / scale);
zoomImageUtils(imageFile, newPath, bufferedImage, newWidth, newHeight);
}
/**
* 等比例改变图片尺寸,本方法也不能处理 png 图片
*
* @param nw
* 新图片的宽度
* @param oldImage
* 原图片
* @throws IOException
*/
public static void constrainProportios(File imageFile,String newPath,int newWidth) throws IOException {
AffineTransform transform = new AffineTransform();
BufferedImage bis = ImageIO.read(imageFile);
int w = bis.getWidth();
int h = bis.getHeight();
int nh = (newWidth * h) / w;
double sx = (double) newWidth / w;
double sy = (double) nh / h;
transform.setToScale(sx, sy);
AffineTransformOp ato = new AffineTransformOp(transform, null);
BufferedImage bid = new BufferedImage(newWidth, nh, BufferedImage.TYPE_3BYTE_BGR);
ato.filter(bis, bid);
ImageIO.write(bid, "jpeg", new File(newPath));
// ImageIO.write(bid, "jpeg", response.getOutputStream());
}
/**
* 按尺寸缩放图片
*
* @param imageFile
* @param newPath
* @param times
* @throws IOException
*/
public static void zoomImage(File imageFile, String newPath, int width, int height) throws IOException {
if (imageFile != null && !imageFile.canRead())
return;
BufferedImage bufferedImage = ImageIO.read(imageFile);
if (null == bufferedImage)
return;
zoomImageUtils(imageFile, newPath, bufferedImage, width, height);
}
private static void zoomImageUtils(File imageFile, String newPath, BufferedImage bufferedImage, int width, int height) throws IOException {
String suffix = StringUtils.substringAfterLast(imageFile.getName(), ".");
// 处理 png 背景变黑的问题
if (suffix != null && (suffix.trim().toLowerCase().endsWith("png") || suffix.trim().toLowerCase().endsWith("gif"))) {
BufferedImage to = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
Graphics2D g2d = to.createGraphics();
to = g2d.getDeviceConfiguration().createCompatibleImage(width, height, Transparency.TRANSLUCENT);
g2d.dispose();
g2d = to.createGraphics();
Image from = bufferedImage.getScaledInstance(width, height, Image.SCALE_AREA_AVERAGING);
g2d.drawImage(from, 0, 0, null);
g2d.dispose();
ImageIO.write(to, suffix, new File(newPath));
} else {
// 高质量压缩,其实对清晰度而言没有太多的帮助
// BufferedImage tag = new BufferedImage(width, height,
// BufferedImage.TYPE_INT_RGB);
// tag.getGraphics().drawImage(bufferedImage, 0, 0, width, height,
// null);
//
// FileOutputStream out = new FileOutputStream(newPath); // 将图片写入
// newPath
// JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
// JPEGEncodeParam jep = JPEGCodec.getDefaultJPEGEncodeParam(tag);
// jep.setQuality(1f, true); //压缩质量, 1 是最高值
// encoder.encode(tag, jep);
// out.close();
BufferedImage newImage = new BufferedImage(width, height, bufferedImage.getType());
Graphics g = newImage.getGraphics();
g.drawImage(bufferedImage, 0, 0, width, height, null);
g.dispose();
ImageIO.write(newImage, suffix, new File(newPath));
}
}
}
上一篇: 概率抽奖
下一篇: caffe使用中出现的问题