Please wait. This can take some minutes ...
Many resources are needed to download a project. Please understand that we have to compensate our server costs. Thank you in advance.
Project price only 1 $
You can buy this project and download/modify it how often you want.
cn.net.wanmo.common.image.ImageUtil Maven / Gradle / Ivy
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;
}
}