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);
}
}