Java 图片压缩到指定宽高的实现方法

1. 简介

在开发中,我们经常需要对图片进行压缩以减小图片文件的大小,提高网页加载速度或者节省存储空间。本文将介绍如何使用 Java 实现图片压缩到指定宽高的功能。

2. 实现步骤

下面是实现这个功能的步骤:

步骤 描述
1 加载原始图片
2 获取原始图片的宽高
3 根据指定的宽高计算压缩比例
4 创建新的图片对象
5 绘制压缩后的图片
6 保存压缩后的图片到指定路径

下面将详细说明每个步骤的具体实现方法。

3. 代码实现

3.1 加载原始图片

首先,我们需要加载原始图片。可以使用 Java 的 ImageIO 类中的 read(File) 方法来加载图片,并将其存储在一个 BufferedImage 对象中。

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

public class ImageCompressor {

    public static void main(String[] args) {
        try {
            BufferedImage originalImage = ImageIO.read(new File("path/to/original/image.jpg"));
            // 其他步骤在这里实现
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

3.2 获取原始图片的宽高

获取原始图片的宽高可以通过 BufferedImage 对象的 getWidth()getHeight() 方法来实现。

int originalWidth = originalImage.getWidth();
int originalHeight = originalImage.getHeight();

3.3 根据指定的宽高计算压缩比例

根据指定的宽高和原始图片的宽高,我们可以计算出压缩比例。如果指定的宽高比原始图片的宽高要小,我们就需要缩小图片,否则就不进行压缩。

int targetWidth = 800; // 指定的宽度
int targetHeight = 600; // 指定的高度

double widthRatio = (double) targetWidth / originalWidth; // 计算宽度压缩比例
double heightRatio = (double) targetHeight / originalHeight; // 计算高度压缩比例

double ratio = Math.min(widthRatio, heightRatio); // 取较小的压缩比例

3.4 创建新的图片对象

根据压缩比例,我们可以计算出压缩后的图片的宽高,并创建一个新的 BufferedImage 对象来存储压缩后的图片。

int compressedWidth = (int) (originalWidth * ratio);
int compressedHeight = (int) (originalHeight * ratio);

BufferedImage compressedImage = new BufferedImage(compressedWidth, compressedHeight, BufferedImage.TYPE_INT_RGB);

3.5 绘制压缩后的图片

使用 Graphics2D 类的 drawImage(Image, int, int, int, int, int, int, int, int, ImageObserver) 方法将原始图片绘制到压缩后的图片对象上。

Graphics2D g2d = compressedImage.createGraphics();
g2d.drawImage(originalImage, 0, 0, compressedWidth, compressedHeight, null);
g2d.dispose();

3.6 保存压缩后的图片到指定路径

最后,我们可以使用 ImageIO 类中的 write(RenderedImage, String, File) 方法将压缩后的图片保存到指定的路径。

File outputImageFile = new File("path/to/compressed/image.jpg");
ImageIO.write(compressedImage, "jpg", outputImageFile);

4. 序列图

下面是实现步骤的序列图:

sequenceDiagram
    participant 开发者
    participant 小白

    小白->>开发者: 请求帮助实现图片压缩
    开发者->>小白: 解释整个流程
    小白->>开发者: 请求代码示例