All Downloads are FREE. Search and download functionalities are using the official Maven repository.

cn.net.wanmo.common.image.ImageUtil Maven / Gradle / Ivy

There is a newer version: 1.0.3
Show newest version
package cn.net.wanmo.common.image;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.imageio.ImageIO;
import javax.imageio.ImageReader;
import javax.imageio.stream.ImageInputStream;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.Iterator;

/**
 * 图片文件工具类
 * https://blog.csdn.net/ycf921244819/article/details/104594670
 */
public class ImageUtil {

    private static Logger logger = LoggerFactory.getLogger(ImageUtil.class);

    /**
     * 获取图片文件实际类型,若不是图片则返回null
     *
     * @param file 图片文件
     * @return 文件类型
     */
    public final static String getFormatName(File file) {
        if (isImage(file) == false) {
            return null;
        }

        try {
            ImageInputStream iis = ImageIO.createImageInputStream(file);
            Iterator iter = ImageIO.getImageReaders(iis);
            if (!iter.hasNext()) {
                return null;
            }

            ImageReader reader = iter.next();
            iis.close();
            return reader.getFormatName().toLowerCase();
        } catch (IOException e) {
            logger.error("获取图片 FormatName 异常", e);
            return null;
        }
    }


    /**
     * 判断文件是否为图片
     *
     * @param file 图片文件
     * @return true 是 | false 否
     */
    public static final boolean isImage(File file) {
        boolean flag = false;
        try {
            BufferedImage bufreader = ImageIO.read(file);
            if (bufreader == null) {
                flag = false;
            } else {
                int width = bufreader.getWidth();
                int height = bufreader.getHeight();

                if (width == 0 || height == 0) {
                    flag = false;
                } else {
                    flag = true;
                }
            }
        } catch (IOException e) {
            logger.error("判断文件是否为图片异常", e);
        }
        return flag;
    }

    /**
     * 图片分辨率压缩
     *
     * @param sourceFile  源图片
     * @param scaledWidth 目标宽
     * @return 结果图片
     * @throws IOException
     */
    public static File resizeWidth(File sourceFile, int scaledWidth) {
        File targetFile = null;
        try {
            targetFile = File.createTempFile("resize", "." + getSuffix(sourceFile));
            boolean flag = resize(sourceFile, targetFile, scaledWidth, 0);

            if (flag == false && targetFile != null) {
                targetFile.deleteOnExit();
                targetFile = null;
            }
        } catch (IOException e) {
            logger.error("图片分辨率压缩异常", e);
        }
        return targetFile;
    }

    /**
     * 图片分辨率压缩
     *
     * @param sourceFile   源图片
     * @param scaledHeight 目标高
     * @return 结果图片
     * @throws IOException
     */
    public static File resizeHeight(File sourceFile, int scaledHeight) {
        File targetFile = null;
        try {
            targetFile = File.createTempFile("resize", "." + getSuffix(sourceFile));
            boolean flag = resize(sourceFile, targetFile, 0, scaledHeight);

            if (flag == false && targetFile != null) {
                targetFile.deleteOnExit();
                targetFile = null;
            }
        } catch (IOException e) {
            logger.error("图片分辨率压缩异常", e);
        }
        return targetFile;
    }


    /**
     * 图片分辨率压缩
     *
     * @param sourceFile   源图片
     * @param targetFile   结果图片
     * @param scaledWidth  目标宽
     * @param scaledHeight 目标高
     * @return 目标图片
     * @throws IOException
     */
    public static boolean resize(File sourceFile, File targetFile, int scaledWidth, int scaledHeight) {
        try {
            BufferedImage bufferedImage = ImageIO.read(sourceFile);
            int width = bufferedImage.getWidth();
            int height = bufferedImage.getHeight();

            if (scaledWidth == 0 && scaledHeight == 0) {
                scaledWidth = width;
                scaledHeight = height;
            }

            if (scaledWidth == 0) {
                {
                    double percentage = scaledHeight * 1.0 / height; // 得到高度百分比
                    scaledWidth = Double.valueOf(percentage * width).intValue(); // 根据高度百分比 计算需要的宽度
                }
                {
//                double percentage = width * 1.0 / height; // 计算原图的宽高百分比
//                scaledWidth = Double.valueOf(percentage * scaledHeight).intValue(); // 根据宽高百分比 计算需要的宽度
                }
            }

            if (scaledHeight == 0) {
                {
                    double percentage = scaledWidth * 1.0 / width; // 得到宽度百分比
                    scaledHeight = Double.valueOf(percentage * height).intValue(); // 根据宽度百分比 计算需要的高度
                }
                {
//                double percentage = height * 1.0 / width; // 计算原图的高宽百分比
//                scaledHeight = Double.valueOf(percentage * scaledWidth).intValue(); // 根据高宽百分比 计算需要的高度
                }
            }

            return resize(bufferedImage, scaledWidth, scaledHeight, targetFile, getFormatName(sourceFile));
        } catch (IOException e) {
            logger.error("图片分辨率压缩异常", e);
            return false;
        }
    }


    /**
     * 图片分辨率压缩
     *
     * @param sourceImage  源图片
     * @param scaledWidth  目标宽
     * @param scaledHeight 目标高
     * @param targetFile   结果图片 为空则会生成临时文件
     * @param formatName   目标格式( jpeg / png )
     * @return 目标文件
     * @throws IOException
     */
    public static boolean resize(BufferedImage sourceImage, int scaledWidth, int scaledHeight, File targetFile, String formatName) {
        boolean flag = false;
        try {
            // *     SSCALE_AREA_AVERAGING: 使用 Area Averaging 图像缩放算法;
            // *     SCALE_DEFAULT: 使用默认的图像缩放算法;
            // *     SCALE_SMOOTH: 选择图像平滑度比缩放速度具有更高优先级的图像缩放算法。
            // Image.SCALE_SMOOTH 的缩略算法  [生成缩略图片的平滑度的优先级比速度高  生成的图片质量比较好  但速度慢]
            Image scaledInstance = sourceImage.getScaledInstance(scaledWidth, scaledHeight, BufferedImage.SCALE_SMOOTH); // 获取压缩后的图片
            BufferedImage targetImage = new BufferedImage(scaledWidth, scaledHeight, sourceImage.getType()); // 创建待输出的图片

            {
                Graphics graphics = targetImage.getGraphics(); // 获取画笔
                graphics.drawImage(scaledInstance, 0, 0, null); // 将Image对象画在画布上,最后一个参数,ImageObserver:接收有关 Image 信息通知的异步更新接口,没用到直接传空
                graphics.dispose(); // 释放资源
            }

            ImageIO.write(targetImage, formatName, targetFile);
            flag = true;
        } catch (IOException e) {
            logger.error("图片分辨率压缩异常", e);
        }

        return flag;
    }


    /**
     * 添加文字水印
     *
     * @param srcImageFile 目标图片
     * @param text         文字内容
     * @param x            水印x坐标
     * @param y            水印y坐标
     * @return 结果图片
     */
    public static File watermarkText(File srcImageFile, String text, int x, int y) {
        File targetFile = null;
        try {
            targetFile = File.createTempFile("watermark", "." + getSuffix(srcImageFile));
            boolean flag = watermarkText(srcImageFile, targetFile, text, x, y);

            if (flag == false && targetFile != null) {
                targetFile.deleteOnExit();
                targetFile = null;
            }
        } catch (IOException e) {
            logger.error("添加文字水印异常", e);
        }
        return targetFile;
    }


    /**
     * 添加文字水印
     *
     * @param srcImageFile 目标图片
     * @param targetFile   结果图片
     * @param text         文字内容
     * @param x            水印x坐标
     * @param y            水印y坐标
     * @return 结果图片
     */
    public static boolean watermarkText(File srcImageFile, File targetFile, String text, int x, int y) {
        boolean flag = false;
        try {
            //使用ImageIO的read方法读取图片
            BufferedImage read = ImageIO.read(srcImageFile);
            Graphics2D graphics = read.createGraphics();
            // 设置“抗锯齿”的属性
            graphics.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
            // 设置字体类型和大小
            graphics.setFont(new Font("微软雅黑", Font.PLAIN, 20));
            // 设置颜色
            graphics.setColor(new Color(255, 255, 255));
            // 添加文字
            graphics.drawString(text, x, y);
            graphics.dispose();

            // 使用ImageIO的write方法进行输出
            ImageIO.write(read, getFormatName(srcImageFile), targetFile);
            flag = true;
        } catch (IOException e) {
            logger.error("添加文字水印异常", e);
        }
        return flag;
    }


    /**
     * 添加图片水印
     *
     * @param srcImageFile 目标图片
     * @param waterImage   水印图片
     * @param x            水印x坐标
     * @param y            水印y坐标
     * @return 结果图片
     */
    public static File watermarkImage(File srcImageFile, File waterImage, int x, int y) {
        File targetFile = null;
        try {
            targetFile = File.createTempFile("watermark", "." + getSuffix(srcImageFile));
            boolean flag = watermarkImage(srcImageFile, targetFile, waterImage, x, y);

            if (flag == false && targetFile != null) {
                targetFile.deleteOnExit();
                targetFile = null;
            }
        } catch (IOException e) {
            logger.error("添加文字水印异常", e);
        }
        return targetFile;

    }

    /**
     * 添加图片水印
     *
     * @param srcImageFile 目标图片
     * @param targetFile   结果图片
     * @param waterImage   水印图片
     * @param x            水印x坐标
     * @param y            水印y坐标
     * @return 是否成功
     */
    public static boolean watermarkImage(File srcImageFile, File targetFile, File waterImage, int x, int y) {
        boolean flag = false;
        try {
            //使用ImageIO的read方法读取图片
            BufferedImage read = ImageIO.read(srcImageFile);
            BufferedImage image = ImageIO.read(waterImage);
            //获取画布
            Graphics2D graphics = read.createGraphics();
            //设置透明度为0.5
            graphics.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, 0.5f));
            //添加水印
            graphics.drawImage(image, x, y, null);
            //关闭透明度
            //graphics.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER));
            graphics.dispose();

            //使用ImageIO的write方法进行输出
            ImageIO.write(read, getFormatName(srcImageFile), targetFile);
            flag = true;
        } catch (IOException e) {
            logger.error("添加图片水印异常", e);
        }
        return flag;
    }

    /**
     * 裁剪图片
     *
     * @param srcImageFile 需要裁剪的图片
     * @param x            裁剪时x的坐标(左上角)
     * @param y            裁剪时y的坐标(左上角)
     * @param width        裁剪后的图片宽度
     * @param height       裁剪后的图片高度
     * @return
     */
    public static File cut(File srcImageFile, int x, int y, int width, int height) {
        File targetFile = null;
        try {
            targetFile = File.createTempFile("cut_image", "." + getSuffix(srcImageFile));
            boolean flag = cut(srcImageFile, targetFile, x, y, width, height);

            if (flag == false && targetFile != null) {
                targetFile.deleteOnExit();
                targetFile = null;
            }
        } catch (IOException e) {
            logger.error("裁剪图片异常", e);
        }
        return targetFile;

    }


    /**
     * 裁剪图片
     *
     * @param srcImageFile  需要裁剪的图片
     * @param destImageFile 裁剪后的图片
     * @param x             裁剪时x的坐标(左上角)
     * @param y             裁剪时y的坐标(左上角)
     * @param width         裁剪后的图片宽度
     * @param height        裁剪后的图片高度
     * @return
     */
    public static boolean cut(File srcImageFile, File destImageFile, int x, int y, int width, int height) {
        boolean flag = false;
        try {
            //使用ImageIO的read方法读取图片
            BufferedImage read = ImageIO.read(srcImageFile);
            //调用裁剪方法
            BufferedImage image = read.getSubimage(x, y, width, height);

            //使用ImageIO的write方法进行输出
            ImageIO.write(image, getFormatName(srcImageFile), destImageFile);
            flag = true;
        } catch (IOException e) {
            logger.error("裁剪图片异常", e);
        }
        return flag;
    }


    /**
     * 获取文件名称
     *
     * @param file 文件
     * @return 文件名称
     */
    public static String getFilename(File file) {
        return file.getName();
    }

    /**
     * 获取图片后缀,优先获取文件名 点 后的后缀, 如果没有,则分析图片流的后缀
     *
     * @param file 图片
     * @return 后缀
     */
    public static String getSuffix(File file) {
        String suffix = null;
        {
            String filename = getFilename(file);
            int indexOf = filename.lastIndexOf(".");

            if (indexOf == -1) {
                suffix = "";
            } else {
                suffix = filename.substring(indexOf + 1);
            }
        }

        if (suffix == null || "".equals(suffix.trim())) {
            suffix = getFormatName(file);
        }

        return suffix;
    }

    /**
     * 获取图片大小 KB
     *
     * @param file 图片
     * @return KB
     */
    public static Double getSizeKB(File file) {
        return file.length() / 1024.0;
    }

    /**
     * 获取图片大小 MB
     *
     * @param file 图片
     * @return MB
     */
    public static Double getSizeMB(File file) {
        return file.length() / 1024.0 / 1024.0;
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy