了实现Java图片压缩,我们可以使用Java的标准库以及一些额外的组件。在提供的代码示例中,可以看到使用了`javax.imageio.ImageIO`和`com.sun.image.codec.jpeg.*`这两个包来处理图片读取、写入和编码。以下是实现图片压缩的关键步骤:
1. **读取图片**:
使用`ImageIO.read(File)`方法读取指定路径的图片文件,返回一个`BufferedImage`对象。这是处理图片的基础。
2. **检查图片格式**:
通过`img.getWidth(null)`和`img.getHeight(null)`获取图片的宽度和高度。如果返回值为-1,表示图片格式不正确或无法读取。
3. **设置输出尺寸**:
在代码中,`outputWidth`和`outputHeight`分别代表输出图片的宽度和高度。默认值为100,可以通过构造函数或setter方法设置。
4. **等比缩放**:
如果`proportion`为true(默认),则进行等比缩放。首先计算原图宽高与目标宽高的比例,保持原始图片的比例不变。如果不想等比缩放,可以直接设定新的宽度和高度。
5. **创建缩放后的图片**:
使用`BufferedImage.createGraphics()`方法创建`Graphics2D`对象,然后调用`drawImage()`方法将原图绘制到新的尺寸上,保持比例。
6. **保存压缩后的图片**:
创建一个`FileOutputStream`,然后使用`JPEGCodec`和`JPEGImageEncoder`来编码和写入JPEG格式的图片。这一步会根据预设的宽度、高度和比例生成压缩后的图片文件。
以下是一个简化的版本,展示了这些步骤:
```java
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import javax.imageio.ImageIO;
public class SimpleCompress {
public static void compress(String inputPath, String outputPath, int maxWidth, int maxHeight) {
try {
BufferedImage srcImage = ImageIO.read(new File(inputPath));
double scaleWidth = ((double) maxWidth) / srcImage.getWidth();
double scaleHeight = ((double) maxHeight) / srcImage.getHeight();
double scale = Math.min(scaleWidth, scaleHeight);
int destWidth = (int) (srcImage.getWidth() * scale);
int destHeight = (int) (srcImage.getHeight() * scale);
BufferedImage destImage = new BufferedImage(destWidth, destHeight, BufferedImage.TYPE_INT_RGB);
Graphics2D g = destImage.createGraphics();
g.drawImage(srcImage, 0, 0, destWidth, destHeight, null);
g.dispose();
ImageIO.write(destImage, "jpg", new File(outputPath));
} catch (IOException e) {
e.printStackTrace();
}
}
}
```
这个简化版的代码没有使用`com.sun`包中的组件,而是依赖于`javax.imageio`标准库,因此更具有移植性。通过调用`SimpleCompress.compress()`方法,传入输入图片路径、输出图片路径以及期望的最大宽度和高度,即可完成图片压缩。
注意,实际开发中,可能还需要考虑其他因素,例如图片质量调整、异常处理、多线程优化等。此外,`com.sun`包中的类在非Sun/Oracle JDK中可能不可用,因此在生产环境中推荐使用标准库API。