TALK IS CHEAP , SHOW THE CODE.
/**
* @author zhq.xiang
*/
public class PicUtils {
private static List<String> picFormatList = null;
static {
picFormatList = Stream.of("jpg", "png", "gif", "webp", "tiff", "bmp", "jpeg").collect(Collectors.toList());
}
/**
* 按比例压缩图片
*
* @param srcPath
* @param rate
* @param outputStream
* @throws Exception
*/
public static void reduceImg(String srcPath, double rate, OutputStream outputStream) throws Exception {
InputStreamDto inputStreamDto = FileUtils.read2InputStreamDto(srcPath);
if (inputStreamDto == null) {
throw new Exception("获取流参数出错。");
}
if (!isPic(inputStreamDto.getFormat())) {
throw new Exception("文件格式不支持");
}
try {
reduceImg(inputStreamDto.getInputStream(), rate, outputStream);
} catch (Exception e) {
e.printStackTrace();
throw e;
} finally {
FileUtils.close(inputStreamDto);
}
}
/**
* 压缩图片
*
* @param inputStream
* @param rate
* @param outputStream
* @throws Exception
*/
public static void reduceImg(InputStream inputStream, double rate, OutputStream outputStream) throws Exception {
BufferedImage read = null;
try {
read = ImageIO.read(inputStream);
int widthDist = (int)(read.getWidth() * rate);
int heightDist = (int)(read.getHeight() * rate);
// 构造一个类型为预定义图像类型之一的 BufferedImage
BufferedImage tag = new BufferedImage(widthDist, heightDist, BufferedImage.TYPE_INT_RGB);
//绘制图像 getScaledInstance表示创建此图像的缩放版本,返回一个新的缩放版本Image,按指定的width,height呈现图像
//Image.SCALE_SMOOTH,选择图像平滑度比缩放速度具有更高优先级的图像缩放算法。
tag.getGraphics().drawImage(read.getScaledInstance(widthDist, heightDist, Image.SCALE_SMOOTH), 0, 0, null);
JPEGImageEncoder jpegEncoder = JPEGCodec.createJPEGEncoder(outputStream);
jpegEncoder.encode(tag);
} catch (IOException e) {
e.printStackTrace();
throw e;
}
}
/**
* 按比例进行缩放图片
*
* @param srcPath 原图地址url
* @param rate 缩放比例
* @param distPath 目标路径
* @return
*/
public static void reduceImg(String srcPath, double rate, String distPath) throws Exception {
FileOutputStream fos = null;
try {
fos = new FileOutputStream(distPath);
reduceImg(srcPath, rate, fos);
} catch (Exception e) {
e.printStackTrace();
throw e;
} finally {
if (fos != null) {
try {
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
/**
* 给图片打上文字水印
* @param logoText log文字
* @param inputStream
* @param outputStream
* @param degree 旋转角度
* @param color 颜色
* @param format 图片后缀
* @param fontSize 字体大小
* @param alpha 透明度
* @param startIndexPer x轴的起始位置,相对宽度的百分比数
* @param endIndexPer y轴的起始位置,相对高度的百分比数
*/
public static void markImageByText(String logoText, InputStream inputStream, OutputStream outputStream,
Integer degree, Color color, String format,int fontSize,float alpha,float startIndexPer,float endIndexPer) {
try {
Image srcImg = ImageIO.read(inputStream);
BufferedImage buffImg = new BufferedImage(srcImg.getWidth(null), srcImg.getHeight(null),
BufferedImage.TYPE_INT_RGB);
// 2、得到画笔对象
Graphics2D g = buffImg.createGraphics();
// 3、设置对线段的锯齿状边缘处理
g.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
g.drawImage(
srcImg.getScaledInstance(srcImg.getWidth(null), srcImg.getHeight(null), java.awt.Image.SCALE_SMOOTH), 0,
0, null);
// 4、设置水印旋转
if (null != degree) {
g.rotate(Math.toRadians(degree), buffImg.getWidth()/2,buffImg.getHeight() /2);
}
// 5、设置水印文字颜色
g.setColor(color);
if(fontSize > (buffImg.getHeight()/2)){
fontSize = buffImg.getHeight()/2;
}
// 6、设置水印文字Font
g.setFont(new java.awt.Font("宋体", java.awt.Font.BOLD, fontSize));
// 7、设置水印文字透明度
g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, alpha));
// 8、第一参数->设置的内容,后面两个参数->文字在图片上的座标位置(x,y)
if(startIndexPer > 1.0f){
startIndexPer = 1.0f;
}
if(endIndexPer > 1.0f){
endIndexPer = 1.0f;
}
g.drawString(logoText, startIndexPer*buffImg.getWidth() , endIndexPer*buffImg.getHeight());
// 9、释放资源
g.dispose();
// 10、生成图片
ImageIO.write(buffImg, format, outputStream);
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 图片能否压缩
*
* @param format
* @return
*/
private static boolean isPic(String format) {
return picFormatList.contains(format);
}
}