public class ImageCompression { private static final Logger log = LoggerFactory.getLogger(ImageCompression.class); /** * 指定图片宽度和高度和压缩比例对图片进行压缩 * * @param imgSrc 源图片地址 */ public static MultipartFile reduceImg(MultipartFile imgSrc) { //目标文件 String slvPath = JavaToLinuxUtil.validWinSystem() ? "/DataDisk/temFile/slt" : "E:\\DataDisk\\temFile\\slt"; File mkdir = new File(slvPath); if (!mkdir.exists()){ mkdir.mkdir(); } File toFile = new File(slvPath + File.separator + imgSrc.getOriginalFilename()); try (FileOutputStream target = new FileOutputStream(toFile)) { File srcFile = MultipartFileTofile.changeForFile(imgSrc, JavaToLinuxUtil.validWinSystem() ? "/DataDisk/temFile/ytp" : "E:\\DataDisk\\temFile\\ytp"); // 检查图片文件是否存在 if (!srcFile.exists()) { log.error("压缩资源文件不存在"); } int[] results = getImgWidthHeight(srcFile); int widthDist = results[0] / 8; int heightDist = results[1] / 8; // 开始读取文件并进行压缩 Image src = ImageIO.read(srcFile); // 构造一个类型为预定义图像类型之一的 BufferedImage BufferedImage source = new BufferedImage(widthDist, heightDist, BufferedImage.TYPE_INT_RGB); // 这边是压缩的模式设置 source.getGraphics().drawImage(src.getScaledInstance(widthDist, heightDist, Image.SCALE_SMOOTH), 0, 0, null); //将图片按JPEG压缩,保存到out中 ImageIO.write(source, "jpg", target); MultipartFile multipartFile = MultipartFileTofile.fileToMultipartFile(toFile); toFile.delete(); return multipartFile; } catch (Exception ef) { ef.printStackTrace(); } return null; } /** * 获取图片宽度和高度 * * @param file 图片路径 * @return 返回图片的宽度 */ public static int[] getImgWidthHeight(File file) { int result[] = {0, 0}; try { // 获得文件输入流 InputStream is = new FileInputStream(file); // 从流里将图片写入缓冲图片区 BufferedImage src = ImageIO.read(is); // 得到源图片宽 result[0] = src.getWidth(null); // 得到源图片高 result[1] = src.getHeight(null); //关闭输入流 is.close(); } catch (Exception ef) { ef.printStackTrace(); } return result; } }
java对图片文件进行压缩
于 2024-07-08 10:08:22 首次发布