图片处理工具类(图片旋转、图片截取、图片压缩、图片中心或右下角添加旋转水印)

 去年今日此门中,人面桃花相映红。人面不知何处去,桃花依旧笑春风。

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值