java 接口,按宽度等比例压缩图片,返回图片流,输出到前台的image标签里
时间: 2023-11-29 10:05:25 浏览: 28
实现按宽度等比例压缩图片并返回图片流的接口,可以按照以下步骤进行:
1. 创建一个接口,定义按宽度等比例压缩图片并返回图片流的方法。
```java
public interface ImageCompressorService {
byte[] compressImage(String srcFilePath, int width) throws Exception;
}
```
2. 实现该接口,并在实现类中实现按宽度等比例压缩图片并返回图片流的方法。
```java
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.File;
import javax.imageio.ImageIO;
public class ImageCompressorServiceImpl implements ImageCompressorService {
@Override
public byte[] compressImage(String srcFilePath, int width) throws Exception {
// 读取原始图片文件
BufferedImage srcImage = ImageIO.read(new File(srcFilePath));
// 获取原始图片的宽度和高度
int srcWidth = srcImage.getWidth();
int srcHeight = srcImage.getHeight();
// 计算等比例缩小后的宽度和高度
int destWidth = width;
int destHeight = (int) (srcHeight * ((double) destWidth / srcWidth));
// 创建一个新的 BufferedImage 对象
BufferedImage destImage = new BufferedImage(destWidth, destHeight, BufferedImage.TYPE_INT_RGB);
// 绘制原始图片到新的 BufferedImage 对象上,并按比例缩小
Graphics2D g = destImage.createGraphics();
g.drawImage(srcImage, 0, 0, destWidth, destHeight, null);
g.dispose();
// 将新的 BufferedImage 对象输出到 ByteArrayOutputStream 对象中
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ImageIO.write(destImage, "jpg", baos);
// 返回压缩后的图片数据
return baos.toByteArray();
}
}
```
3. 在控制器中调用该接口方法,并将返回的图片流输出到前台的 image 标签里。
```java
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
public class ImageController {
@Autowired
private ImageCompressorService imageCompressorService;
@GetMapping("/image/{id}")
@ResponseBody
public byte[] getImage(@PathVariable("id") String id) throws Exception {
// 获取原始图片文件路径,这里假设原始图片文件名为 "{id}.jpg",保存在项目的 "images" 目录下
String srcFilePath = "images/" + id + ".jpg";
// 调用接口方法进行图片压缩,并返回压缩后的图片流
byte[] compressedImageData = imageCompressorService.compressImage(srcFilePath, 800);
// 返回压缩后的图片流
return compressedImageData;
}
}
```
上面的代码中,控制器的 getImage 方法接收一个参数 id,用于获取原始图片的文件名。在方法中,我们调用了 ImageCompressorService 接口的 compressImage 方法对原始图片进行压缩,并返回压缩后的图片流。最后,我们将返回的图片流直接输出到前台的 image 标签里。