zoukankan      html  css  js  c++  java
  • 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才可以)
  • 相关阅读:
    Laya list 居中
    Laya for...in和for each...in
    idea中tomcat启动失败

    通过Mock测试控制器
    Mybatis查询sql传入一个字符串传参数,报There is no getter for property named 'ids' in 'class java.lang.String'。
    Application Server was not connected before run configuration stop, reason: Unable to ping server at localhost:1099
    System.getProperty("XXX")方法
    linux命令
    JDK,IDEA,Tomcat,maven,MySQL的安装
  • 原文地址:https://www.cnblogs.com/pxblog/p/15393330.html
Copyright © 2011-2022 走看看