ImageUtil.java 7.8 KB
package com.teplot.common;

import java.awt.Dimension;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;

import javax.imageio.ImageIO;

import com.jfinal.kit.StrKit;
import com.jfinal.log.Log;

import net.coobird.thumbnailator.Thumbnails;
import net.coobird.thumbnailator.geometry.Positions;

/**
 * Depiction: 图片处理工具
 * <p>
 * Modify:
 * <p>
 * Author: Kevin Lynn
 * <p>
 * Create Date:2017年4月6日 下午12:35:36
 * 
 */
public class ImageUtil {

	public ImageUtil() {
	}

	public static boolean isImage(String fileName) {
		if (StrKit.isBlank(fileName)) {
			return false;
		}

		fileName = fileName.toLowerCase();
		if (fileName.endsWith(".png") || fileName.endsWith(".jpg") || fileName.endsWith(".jpeg")
				|| fileName.endsWith(".bmp")) {
			return true;
		}

		return false;
	}

	/**
	 * 计算图片尺寸
	 * 
	 * @param imgPath
	 *            图片路径
	 * @return {@link Dimension}
	 */
	public static Dimension getImageSize(String imgPath) {
		Dimension dimen = new Dimension(0, 0);

		File file = new File(imgPath);
		try {
			BufferedImage reader = ImageIO.read(new FileInputStream(file));
			dimen.setSize(reader.getWidth(), reader.getHeight());
		} catch (IOException e) {
			Log.getLog(new Dimension().getClass()).error("getImageSize()-->" + e.toString());
		}

		return dimen;
	}

	/**
	 * 根据图片宽度的最大尺寸计算应该缩放的比例
	 * 
	 * @param srcImageFile
	 *            图片源文件
	 * @param limitWidth
	 *            宽度最大尺寸
	 * @return scale
	 */
	public final static double computeScale(String srcImageFile, double limitWidth) {
		double scale = 1.0;
		Image img;
		try {
			img = ImageIO.read(new File(srcImageFile));
			int originalWidth = img.getWidth(null);
			if (originalWidth <= limitWidth) {
				scale = 1.0;
			} else {
				scale = limitWidth / originalWidth;
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
		return scale;
	}

	/**
	 * 缩放图像(根据最大宽度按比例缩放)
	 * 
	 * @param srcImageFile
	 *            源图像文件地址
	 * @param result
	 *            缩放后的图像地址
	 * @limitWidth 最大宽度
	 */
	public final static void scaleImage(String srcImageFile, String newImageFile, double limitWidth) {
		double scale = ImageUtil.computeScale(srcImageFile, limitWidth);
		if (scale > 1.0) {
			scale(srcImageFile, srcImageFile, scale);
		}
	}

	/**
	 * 缩放图像(按比例缩放)
	 * 
	 * @param srcImageFile
	 *            源图像文件地址
	 * @param result
	 *            缩放后的图像地址
	 * @scale 缩放比例,一般是小于1的小数
	 */
	public final static void scale(String srcImageFile, String newImageFile, double scale) {
		try {
			Thumbnails.of(srcImageFile).scale(scale).toFile(newImageFile);
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	/**
	 * 缩放图像(按高度和宽度缩放)
	 * 
	 * @param srcImageFile
	 *            源图像文件地址
	 * @param result
	 *            缩放后的图像地址
	 * @param height
	 *            缩放后的高度
	 * @param width
	 *            缩放后的宽度
	 * @throws IOException
	 */
	public final static void scale(String srcImageFile, String newImageFile, int width, int height) throws IOException {
		Image img = ImageIO.read(new File(srcImageFile));
		int newWidth = img.getWidth(null), newHeight = img.getHeight(null);

		// 计算比例
		if (img.getWidth(null) <= width) {
			// 无线调用时,宽度没有压缩宽大,则返回原图
		} else if ((img.getHeight(null) > height) || (img.getWidth(null) > width)) {
			// vst端:原图长/压缩长 > 原图宽/压缩图宽 ? 原图长/压缩长:原图宽/压缩图宽,以比例较大的为基准压缩
			// 压缩比判断方法二
			double ratio_height = (new Integer(height)).doubleValue() / img.getHeight(null);
			double ratio_width = (new Integer(width)).doubleValue() / img.getWidth(null);

			if (ratio_height > ratio_width) {
				newHeight = height;
				newWidth = (int) ((new Integer(height)).doubleValue() / img.getHeight(null) * img.getWidth(null));
			} else {
				newWidth = width;
				newHeight = (int) ((new Integer(width)).doubleValue() / img.getWidth(null) * img.getHeight(null));
			}
		}

		Thumbnails.of(srcImageFile).size(newWidth, newHeight).toFile(newImageFile);

	}

	/**
	 * 添加图片水印
	 * 
	 * @param targetImg
	 *            目标图片路径,如:C:\\myPictrue\\1.jpg
	 * @param waterImg
	 *            水印图片路径,如:C:\\myPictrue\\logo.png
	 * @param positions
	 *            水印图片所在位置
	 * 
	 * @param alpha
	 *            透明度(0.0 -- 1.0, 0.0为完全透明,1.0为完全不透明) * @param quality 压缩清晰度
	 *            <b>建议为1.0</b>
	 * @throws IOException
	 */
	public final static void pressImage(String targetImg, File waterImg, Positions positions, float alpha)
			throws IOException {
		Thumbnails.of(targetImg).watermark(positions, ImageIO.read(waterImg), alpha).scale(1)// 缩放比例
				.toFile(targetImg);
	}

	/**
	 * 把图片印刷到图片上
	 * 
	 * @param pressImg
	 *            -- 水印文件
	 * @param targetImg
	 *            -- 目标文件
	 * @param alpha
	 *            透明度(0.0 -- 1.0, 0.0为完全透明,1.0为完全不透明) * @param quality 压缩清晰度
	 *            <b>建议为1.0</b>
	 * 
	 * @throws IOException
	 */
	public final static void pressImage(String targetImg, String pressImg, float alpha) throws IOException {
		Thumbnails.of(targetImg).watermark(Positions.TOP_LEFT, ImageIO.read(new File(pressImg)), alpha).outputQuality(1)// 生成质量100%
				.scale(1)// 缩放比例
				.toFile(targetImg);
	}

	/**
	 * 把图片印刷到图片上
	 * 
	 * @param pressImg
	 *            -- 水印文件
	 * @param targetImg
	 *            -- 目标文件
	 * @param position
	 * 
	 * @param alpha
	 *            透明度(0.0 -- 1.0, 0.0为完全透明,1.0为完全不透明) * @param quality 压缩清晰度
	 *            <b>建议为1.0</b>
	 * 
	 * @throws IOException
	 */
	public final static void pressImage(String targetImg, String pressImg, Positions position, float alpha)
			throws IOException {
		Thumbnails.of(targetImg).watermark(position, ImageIO.read(new File(pressImg)), alpha).outputQuality(1)// 生成质量100%
				.scale(1)// 缩放比例
				.toFile(targetImg);
	}

	/**
	 * 裁剪图片
	 * 
	 * @throws IOException
	 */
	public static void region(String sourceImg, String newImgPath, int x, int y, int width, int height)
			throws IOException {
		// 指定坐标
		Thumbnails.of(sourceImg).sourceRegion(x, y, width, height)// x轴、y轴,裁剪宽、裁剪高
				.size(width, height)// 裁剪后的图片生成的尺寸
				// 设置是否按比例 false,图片可能会走形 默认true,必须在设置尺寸后设置
				.keepAspectRatio(false).toFile(newImgPath);
	}

	/**
	 * 旋转图片
	 * 
	 * @param sourceImage
	 *            原图片
	 * @param newImage
	 *            生成的新图片
	 * @param degrees
	 *            旋转度数
	 * @throws IOException
	 */
	public static void rorate(String sourceImage, String newImage, double degrees) throws IOException {
		Thumbnails.of(sourceImage).rotate(degrees)// 旋转度数
				.scale(1)// 缩放比例
				.toFile(newImage);
	}

	/**
	 * 转换图片格式
	 * 
	 * @param sourceImg
	 *            原图
	 * @param newImg
	 *            转换后的新图
	 * @param format
	 *            格式
	 * @throws IOException
	 */
	public static void transferImageFormat(String sourceImg, String newImg, String format) throws IOException {
		Thumbnails.of(sourceImg).outputFormat(format).scale(1).toFile(newImg);
	}

	public static void main(String[] args) {
		String srcImageFile = "/Users/Kevin/Downloads/酒图片/1.jpg";
		ImageUtil.scaleImage(srcImageFile, srcImageFile, 100);
	}
}