JAVA实现根据图片生成缩略图、裁剪、压缩图片
依赖(用来复制文件,可以根据自己的来)
<dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.8.0</version> </dependency>
ImageScaleUtils.java
import org.apache.commons.io.FileUtils; import javax.imageio.ImageIO; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; /** * @author * @date 2021/10/11 */ public class ImageScaleUtils { /** * 缩小图片 * * @param srcFile 原图片 * @param destFile 目标图片 * @param boxWidth 缩略图最大宽度 * @param boxHeight 缩略图最大高度 * @throws IOException */ public static void resizeFix(File srcFile, File destFile, int boxWidth, int boxHeight) throws IOException { BufferedImage srcImgBuff = ImageIO.read(srcFile); int width = srcImgBuff.getWidth(); int height = srcImgBuff.getHeight(); if (width <= boxWidth && height <= boxHeight) { FileUtils.copyFile(srcFile, destFile); return; } int zoomWidth; int zoomHeight; if ((float) width / height > (float) boxWidth / boxHeight) { zoomWidth = boxWidth; zoomHeight = Math.round((float) boxWidth * height / width); } else { zoomWidth = Math.round((float) boxHeight * width / height); zoomHeight = boxHeight; } BufferedImage imgBuff = scaleImage(srcImgBuff, width, height, zoomWidth, zoomHeight); writeFile(imgBuff, destFile); } /** * 裁剪并压缩 * * @param srcFile 原文件 * @param destFile 目标文件 * @param boxWidth 缩略图最大宽度 * @param boxHeight 缩略图最大高度 * @param cutTop 裁剪TOP * @param cutLeft 裁剪LEFT * @param cutWidth 裁剪宽度 * @param catHeight 裁剪高度 * @throws IOException */ public static void resizeFix(File srcFile, File destFile, int boxWidth, int boxHeight, int cutTop, int cutLeft, int cutWidth, int catHeight) throws IOException { BufferedImage srcImgBuff = ImageIO.read(srcFile); srcImgBuff = srcImgBuff.getSubimage(cutTop, cutLeft, cutWidth, catHeight); int width = srcImgBuff.getWidth(); int height = srcImgBuff.getHeight(); if (width <= boxWidth && height <= boxHeight) { writeFile(srcImgBuff, destFile); return; } int zoomWidth; int zoomHeight; if ((float) width / height > (float) boxWidth / boxHeight) { zoomWidth = boxWidth; zoomHeight = Math.round((float) boxWidth * height / width); } else { zoomWidth = Math.round((float) boxHeight * width / height); zoomHeight = boxHeight; } BufferedImage imgBuff = scaleImage(srcImgBuff, width, height, zoomWidth, zoomHeight); writeFile(imgBuff, destFile); } public static void writeFile(BufferedImage imgBuf, File destFile) throws IOException { File parent = destFile.getParentFile(); if (!parent.exists()) { parent.mkdirs(); } ImageIO.write(imgBuf, "jpeg", destFile); } private static BufferedImage scaleImage(BufferedImage srcImgBuff, int width, int height, int zoomWidth, int zoomHeight) { int[] colorArray = srcImgBuff.getRGB(0, 0, width, height, null, 0, width); BufferedImage outBuff = new BufferedImage(zoomWidth, zoomHeight, BufferedImage.TYPE_INT_RGB); // 宽缩小的倍数 float wScale = (float) width / zoomWidth; int wScaleInt = (int) (wScale + 0.5); // 高缩小的倍数 float hScale = (float) height / zoomHeight; int hScaleInt = (int) (hScale + 0.5); int area = wScaleInt * hScaleInt; int x0, x1, y0, y1; int color; long red, green, blue; int x, y, i, j; for (y = 0; y < zoomHeight; y++) { // 得到原图高的Y坐标 y0 = (int) (y * hScale); y1 = y0 + hScaleInt; for (x = 0; x < zoomWidth; x++) { x0 = (int) (x * wScale); x1 = x0 + wScaleInt; red = green = blue = 0; for (i = x0; i < x1; i++) { for (j = y0; j < y1; j++) { color = colorArray[width * j + i]; red += getRedValue(color); green += getGreenValue(color); blue += getBlueValue(color); } } outBuff.setRGB(x, y, comRGB((int) (red / area), (int) (green / area), (int) (blue / area))); } } return outBuff; } private static int getRedValue(int rgbValue) { return (rgbValue & 0x00ff0000) >> 16; } private static int getGreenValue(int rgbValue) { return (rgbValue & 0x0000ff00) >> 8; } private static int getBlueValue(int rgbValue) { return rgbValue & 0x000000ff; } private static int comRGB(int redValue, int greenValue, int blueValue) { return (redValue << 16) + (greenValue << 8) + blueValue; } public static void main(String[] args) throws Exception{ resizeFix( new File("C:\\Users\\Public\\Pictures\\Sample Pictures\\Chrysanthemum.jpg"), new File( "C:\\Users\\Public\\Pictures\\Sample Pictures\\Chrysanthemum-1.jpg"), 310, 310); resizeFix( new File("C:\\Users\\Public\\Pictures\\Sample Pictures\\Chrysanthemum.jpg"), new File( "C:\\Users\\Public\\Pictures\\Sample Pictures\\Chrysanthemum-2.jpg"), 310, 310,140,200,300,400); } }
-----------------------有任何问题可以在评论区评论,也可以私信我,我看到的话会进行回复,欢迎大家指教------------------------
(蓝奏云官网有些地址失效了,需要把请求地址lanzous改成lanzoux才可以)
分类:
JAVA
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了