去年今日此门中,人面桃花相映红。人面不知何处去,桃花依旧笑春风。
package com.sunrise.commons.utils;
import java.awt.AlphaComposite;
import java.awt.Color;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Rectangle;
import java.awt.RenderingHints;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Iterator;
import javax.imageio.ImageIO;
import javax.imageio.ImageReadParam;
import javax.imageio.ImageReader;
import javax.imageio.stream.ImageInputStream;
import org.springframework.web.multipart.MultipartFile;
//import com.sunrise.commons.utils.jpeg.JPEGCodec;
//import com.sunrise.commons.utils.jpeg.JPEGImageEncoder;
@SuppressWarnings("restriction")
public class ImagesUtil {
/**
*
* @param srcPath 源文件路径
* @param targetPath 目标文件路径
* @param size 压缩到多少kb以下
* @return
* @throws Exception
*/
public static String CompressPic(String srcPath,String targetPath,int size) throws Exception {
double cutPercent=0.9;
File file=new File(srcPath);
BufferedImage bufferedImage=ImageIO.read(new FileInputStream(file));
int width=bufferedImage.getWidth(null);
int height=bufferedImage.getHeight(null);
long fileLength=file.length();
long fileSize = fileLength/1024;
if(fileSize>500){
if(fileSize<1000){
cutPercent = 0.1;
}else{
cutPercent = 0.9;
}
}
while((fileLength/1024)>=size) {
long time = System.currentTimeMillis();
int newWidth = (int)(width*(1-cutPercent));
int newHeight = (int)(height*(1-cutPercent));
Image image = bufferedImage.getScaledInstance(newWidth, newHeight,Image.SCALE_SMOOTH);
BufferedImage outputImage = new BufferedImage(newWidth, newHeight,BufferedImage.TYPE_INT_ARGB);
Graphics graphics = outputImage.getGraphics();
graphics.drawImage(image, 0, 0, null);
graphics.dispose();
ImageIO.write(outputImage, "png", new File(targetPath));
File file1=new File(targetPath);
BufferedImage bufferedImage1=ImageIO.read(new FileInputStream(file1));
width=bufferedImage1.getWidth(null);
height=bufferedImage1.getHeight(null);
fileLength=file1.length();
// System.out.println("压缩一次耗时:"+(System.currentTimeMillis()-time)/1000);
}
return targetPath;
}
/**
* 将图片顺时间旋转degree度 (按原图片尺寸)
* @param srcPath 源文件路径
* @param degree 旋转度数
* @param targetPath 模板文件路径
* @return
* @throws Exception
*/
public static BufferedImage rotateImage(String srcPath,final int degree,String targetPath)throws Exception {
File file2 = new File(srcPath);
BufferedImage bufferedImage = null;
bufferedImage = ImageIO.read(file2);
int w = bufferedImage.getWidth();
int h = bufferedImage.getHeight();
int type = bufferedImage.getColorModel().getTransparency();
BufferedImage img;
Graphics2D graphics2d;
(graphics2d = (img = new BufferedImage(h, w, type))
.createGraphics()).setRenderingHint(
RenderingHints.KEY_INTERPOLATION,
RenderingHints.VALUE_INTERPOLATION_BILINEAR);
graphics2d.translate((h - w) / 2, (w - h) / 2);
graphics2d.rotate(Math.toRadians(degree), w / 2, h / 2);
graphics2d.drawImage(bufferedImage, 0, 0, null);
graphics2d.dispose();
Image image = img.getScaledInstance(img.getWidth(), img.getHeight(), Image.SCALE_SMOOTH);
BufferedImage outputImage = new BufferedImage(img.getWidth(), img.getHeight(), BufferedImage.TYPE_INT_ARGB);
Graphics graphics = outputImage.getGraphics();
graphics.drawImage(image, 0, 0, null);
graphics.dispose();
ImageIO.write(outputImage, "png", new File(targetPath));
return img;
}
/**
* 给图片添加水印
* @param logoText 水印文字
* @param srcPath 源文件路径
* @param targerPath 模板文件路径
* @param degree 逆时针水印旋转角度
*/
public static void markImageByText(String logoText, String srcPath,String targerPath, Integer degree) {
InputStream is = null;
OutputStream os = null;
try {
// 1、源图片
File file = new File(srcPath);
ImageInputStream imagein= ImageIO.createImageInputStream(new FileInputStream(file));
Image srcImg = ImageIO.read(imagein);
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), Image.SCALE_SMOOTH), 0, 0, null);
// 4、设置水印文字颜色
g.setColor(Color.black);
// 5、设置水印文字Font
Font font = new Font("宋体", Font.BOLD, 20);
g.setFont(font);
float alpha = 0.5f; // 透明度
// 6、设置水印文字透明度
g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP,alpha));
// 7、第一参数->设置的内容,后面两个参数->文字在图片上的坐标位置(x,y)
FontMetrics fm = g.getFontMetrics(font);
int textWidth = fm.stringWidth(new SimpleDateFormat("yyyy年MM月dd日HH时mm分ss秒 ").format(new Date()));
int textHeight = fm.getHeight();
//中心
g.rotate(Math.toRadians(-degree),(double) buffImg.getWidth() / 2, (double) buffImg.getHeight() / 2);
g.drawString("仅用于XXXXXX业务办理", (buffImg.getWidth()-textWidth)/2, (buffImg.getHeight()-textHeight*3)/2);
g.drawString("XX分公司("+logoText+")", (buffImg.getWidth()-textWidth)/2, (buffImg.getHeight()-textHeight*3)/2+20);
g.drawString(new SimpleDateFormat("yyyy年MM月dd日HH时mm分ss秒 ").format(new Date()), (buffImg.getWidth()-textWidth)/2, (buffImg.getHeight()-textHeight*3)/2+40);
//右下角
//g.rotate(Math.toRadians(-degree),buffImg.getWidth()-textWidth, buffImg.getHeight()-textHeight);
//g.drawString("仅用于XXXXXX业务办理", buffImg.getWidth()-textWidth, buffImg.getHeight()-textHeight*3);
//g.drawString("XX分公司("+logoText+")", buffImg.getWidth()-textWidth, buffImg.getHeight()-textHeight*2);
//g.drawString(new SimpleDateFormat("yyyy年MM月dd日HH时mm分ss秒 ").format(new Date()), buffImg.getWidth()-textWidth, buffImg.getHeight()-textHeight);
// 8、释放资源
g.dispose();
// 9、生成图片
os = new FileOutputStream(targerPath);
ImageIO.write(buffImg, "JPG", os);
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (null != is)
is.close();
} catch (Exception e) {
e.printStackTrace();
}
try {
if (null != os)
os.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
/**
* 截图图片右半部分
* @param filePath 原文件路径
* @param subFilePath 输出文件路径
* @throws Exception
*/
public static void subImage(String filePath,String subFilePath)throws Exception{
ImageInputStream iis = ImageIO.createImageInputStream(new File(filePath));
//图片读取器
Iterator<ImageReader> it = ImageIO.getImageReaders(iis);
if (it.hasNext()) {
ImageReader r = it.next();
//设置输入流
r.setInput(iis, true);
System.out.println("格式=" + r.getFormatName());
System.out.println("宽=" + r.getWidth(0));
System.out.println("高=" + r.getHeight(0));
//读取参数
ImageReadParam param = r.getDefaultReadParam();
//创建要截取的矩形范围
Rectangle rect = new Rectangle(r.getWidth(0)/2, 0, r.getWidth(0), r.getHeight(0));
//设置截取范围参数
param.setSourceRegion(rect);
//读取截图数据
BufferedImage bi = r.read(0, param);
// 保存图片
ImageIO.write(bi, "png", new File(subFilePath));
}
}
public static void main(String[] args) throws Exception {
markImageByText("哈哈", "F:/20190801155126453560.png", "F:/20190801155126453560shuiyin.png", 45);
//rotateImage("F:/test.jpg",90,"F:/test2.jpg");
/*File file3=new File("f:/20190801155126453560.png");
BufferedImage bufferedImage3=ImageIO.read(new FileInputStream(file3));
System.out.println(file3.length());
int width3=bufferedImage3.getWidth(null);
int height3=bufferedImage3.getHeight(null);
System.out.println("压缩前图片的宽为:"+width3);
System.out.println("压缩前图片的高为:"+height3);
ImagesUtil.CompressPic("f:/20190801155126453560.png", "f:/20190801155126453560zip.png",500);
File file4=new File("f:/20190801155126453560zip.png");
BufferedImage bufferedImage4=ImageIO.read(new FileInputStream(file4));
System.out.println(file4.length());
int width4=bufferedImage4.getWidth(null);
int height4=bufferedImage4.getHeight(null);
System.out.println("压缩后图片的宽为:"+width4);
System.out.println("压缩后图片的高为:"+height4);*/
}
}