package com.util.pic_mange;
import java.awt.;
 import java.awt.image.BufferedImage;
 import java.io.;
import javax.imageio.ImageIO;
public class pic_main {
// 水印url
private final static String LOGO_URL = "c:\\logo.png";

// 处理之前的图片路径   非递归处理
private final static String OLD_PIC_URL = "c:\\old\\";

// 正方形处理之后输出的图路径   可自动创建
private final static String NEW_PIC_URL = "c:\\new\\";

// 加上水印之后的图片处理玩路径 可自动创建
private final static String NEW_WATERMARK_URL = "c:\\watermark\\";

// 超过最大大小 移动到其他文件下
private  final  static  Integer MAX_FILE_SIZE = 2;

// 超过上面设置的大小移动到下面文件夹
private  final  static  String LARGE_FILE_URL = "c:\\large\\";

// 水印透明度
private static float alpha = 0.9f;

public static void main(String[] args) throws FileNotFoundException, IOException {

    File file = new File(NEW_PIC_URL);
    if (!file.exists()) {
        file.mkdirs();
    }
    file = new File(NEW_WATERMARK_URL);
    if (!file.exists()) {
        file.mkdirs();
    }
    file = new File(LARGE_FILE_URL);
    if (!file.exists()) {
        file.mkdirs();
    }
    delFile(NEW_PIC_URL);
    delFile(NEW_WATERMARK_URL);
    delFile(LARGE_FILE_URL);
    File[] files = new File(OLD_PIC_URL).listFiles();
    for (int i = 0; i < files.length; i++) {

        if (files[i].isFile()) {
            //输出文件名
            String filename = files[i].getName();

            //添加图片水印
            ImageRemarkUtil.markImageByIcon(LOGO_URL, OLD_PIC_URL + filename, NEW_WATERMARK_URL + filename, 45);  //markImageByIcon。

            BufferedImage image = ImageIO.read(new FileInputStream(new File(NEW_WATERMARK_URL + filename)));
            //判断宽高最大的一个值
            int max = Math.max(image.getHeight(), image.getWidth());
            BufferedImage outImage = new BufferedImage(max, max, BufferedImage.TYPE_INT_RGB);
            Graphics2D graphics2D = outImage.createGraphics();
            outImage = graphics2D.getDeviceConfiguration().createCompatibleImage(max, max, Transparency.TRANSLUCENT);
            graphics2D.dispose();
            graphics2D = outImage.createGraphics();
            //原图高度
            int oldheight = image.getHeight();
            //原图宽度
            int oldwidth = image.getWidth();
            // 设置图片居中显示
            graphics2D.drawImage(image, (max - oldwidth) / 2, (max - oldheight) / 2, null);

            graphics2D.dispose();
            //生成新的图片 生成jpg图片有bug会生成变色问题
            ImageIO.write(outImage, "png", new File(NEW_PIC_URL + filename));

            System.out.println(OLD_PIC_URL + filename + "处理完毕!");

        }
    }
    //重命名 ImageIO.write直接生成jpg有变色现象
    suffixRename(NEW_PIC_URL, "jpg", "png");

    //删除水印图片
    delFile(NEW_WATERMARK_URL);
    System.out.println("处理" + files.length + "张图片成功");
}

/**
 * 删除文件
 *
 * @param fileName 文件目录
 * @return
 */
public static void delFile(String fileName) {
    File file = new File(fileName);
    File[] fs = file.listFiles();
    for (int i = 0; i < fs.length; i++) {
        File f2 = fs[i];
        if (!f2.delete()){
            int j = 0;
            for ( ;j< 10 ;j++){
                System.gc();
                if (f2.delete()){
                    break;
                }
            }if (j == 10){
                System.out.println(f2.getName()+"删除失败");
            }

        }

    }
}
/**
 * @param path 要批量修改后缀名文件夹路径
 * @param from 源文件后缀名
 * @param to   修改后目标文件后缀名
 */
public static void suffixRename(String path, String from, String to) {
    File largeFile = new File(LARGE_FILE_URL);
    File file = new File(path);
    File[] fs = file.listFiles();
    for (int i = 0; i < fs.length; i++) {
        File f2 = fs[i];
        if (f2.isDirectory()) {
            suffixRename(f2.getPath(), from, to);
        } else {
            if (f2.length() > (MAX_FILE_SIZE * 1024 * 1024)){
                f2.renameTo(new File(LARGE_FILE_URL+f2.getName()));
            }
            String name = f2.getName();
            if (name.endsWith(from)) {
                f2.renameTo(new File(f2.getParent() + File.separator
                        + name.substring(0, name.indexOf(from)) + to));
            }

        }
    }
}}
package com.util.pic_mange;
import java.awt.AlphaComposite;
 import java.awt.Color;
 import java.awt.Font;
 import java.awt.Graphics2D;
 import java.awt.Image;
 import java.awt.RenderingHints;
 import java.awt.image.BufferedImage;
 import java.io.File;
 import java.io.FileOutputStream;
 import java.io.InputStream;
 import java.io.OutputStream;
 import java.util.ArrayList;
 import java.util.List;import javax.imageio.ImageIO;
 import javax.swing.ImageIcon;/*******************************************************************************
• Description: 图片水印工具类
• @author toyn
• @version 1.0
 */
 public class ImageRemarkUtil {
// 水印透明度
 private static float alpha = 0.2f;
 // 水印横向位置
 private static int positionWidth = 0;
 // 水印纵向位置
 private static int positionHeight = 0;
 // 水印文字字体
 private static Font font = new Font(“宋体”, Font.BOLD, 72);
 // 水印文字颜色
 private static Color color = Color.red;
/**
 *• @param alpha
水印透明度• @param positionWidth
水印横向位置• @param positionHeight
水印纵向位置• @param font
水印文字字体• @param color
水印文字颜色*/
 public static void setImageMarkOptions(float alpha, int positionWidth,
 int positionHeight, Font font, Color color) {
 if (alpha != 0.0f)
 ImageRemarkUtil.alpha = alpha;
 if (positionWidth != 0)
 ImageRemarkUtil.positionWidth = positionWidth;
 if (positionHeight != 0)
 ImageRemarkUtil.positionHeight = positionHeight;
 if (font != null)
 ImageRemarkUtil.font = font;
 if (color != null)
 ImageRemarkUtil.color = color;
 }/**
• 给图片添加水印图片
• 
• @param iconPath
水印图片路径• @param srcImgPath
源图片路径• @param targerPath
目标图片路径*/
 public static void markImageByIcon(String iconPath, String srcImgPath,
 String targerPath) {
 markImageByIcon(iconPath, srcImgPath, targerPath, null);
 }/**
• 给图片添加水印图片、可设置水印图片旋转角度
• 
• @param iconPath
水印图片路径• @param srcImgPath
源图片路径• @param targerPath
目标图片路径• @param degree
水印图片旋转角度*/
 public static void markImageByIcon(String iconPath, String srcImgPath,
 String targerPath, Integer degree) {
 OutputStream os = null;
 try {Image srcImg = ImageIO.read(new File(srcImgPath));

     BufferedImage buffImg = new BufferedImage(srcImg.getWidth(null),
             srcImg.getHeight(null), BufferedImage.TYPE_INT_RGB);
     // 1、得到画笔对象
     Graphics2D g = buffImg.createGraphics();

     // 2、设置对线段的锯齿状边缘处理
     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);
     // 3、设置水印旋转
     if (null != degree) {
         g.rotate(Math.toRadians(degree),
                 (double) buffImg.getWidth() / 2,
                 (double) buffImg.getHeight() / 2);
     }

     // 4、水印图片的路径 水印图片一般为gif或者png的,这样可设置透明度
     ImageIcon imgIcon = new ImageIcon(iconPath);
     // 5、得到Image对象。
     Image img = imgIcon.getImage();

     g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP,
             alpha));


     //计算 水印位置
     Integer x =( buffImg.getWidth()-img.getWidth(null))/2;
     Integer y =( buffImg.getHeight()-img.getHeight(null))/2;
     //中间加入水印
     g.drawImage(img, x, y, null);
     g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER));
     // 7、释放资源
     g.dispose();

     // 8、生成图片
     os = new FileOutputStream(targerPath);
     ImageIO.write(buffImg, "png", os);

     // System.out.println("图片完成添加水印图片");

 } catch (Exception e) {
     e.printStackTrace();
 } finally {
     try {
         if (null != os)
             os.close();
     } catch (Exception e) {
         e.printStackTrace();
     }
 }}
/**
• 给图片添加水印文字
• 
• @param logoText
水印文字• @param srcImgPath
源图片路径• @param targerPath
目标图片路径*/
 public static void markImageByText(String logoText, String srcImgPath,
 String targerPath) {
 // markImageByText(logoText, srcImgPath, targerPath, null);
 }/**
• 给图片添加水印文字、可设置水印文字的旋转角度
• 
• @param logoText
• @param srcImgPath
• @param targerPath
• @param degree
 */
 public static void markImageByText(String logoText, String srcImgPath,
 String targerPath, Integer degree, int positionWidth, int positionHeight) {
InputStream is = null;
 OutputStream os = null;
 try {
 // 1、源图片
 Image srcImg = ImageIO.read(new File(srcImgPath));
 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、设置水印旋转
 if (null != degree) {
     g.rotate(Math.toRadians(degree),
             (double) buffImg.getWidth() / 2,
             (double) buffImg.getHeight() / 2);
 }
 // 5、设置水印文字颜色
 g.setColor(color);
 // 6、设置水印文字Font
 g.setFont(font);
 // 7、设置水印文字透明度
 g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP,
         alpha));
 // 8、第一参数->设置的内容,后面两个参数->文字在图片上的坐标位置(x,y)
 g.drawString(logoText, positionWidth, positionHeight);
 // 9、释放资源
 g.dispose();
 // 10、生成图片
 os = new FileOutputStream(targerPath);
 ImageIO.write(buffImg, "JPG", os);

 System.out.println("图片完成添加水印文字");} 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();
 }
 }
 }public static List findFiles(String dirPath) {
List<String> fileList = new ArrayList<String>();

 // 获得指定文件对象
 File file = new File(dirPath);
 // 获得该文件夹内的所有文件
 File[] array = file.listFiles();

 for(int i=0;i<array.length;i++){
     if(array[i].isFile()) { //如果是文件
         fileList.add(array[i].getAbsolutePath());
     }
 }

 return fileList;}
/*public static void main(String[] args) {
 String srcImgPath = “F:\old\”;
 String targetImgPath = “F:\new\”;
 String logoText = “水 印 标 识”;
 String logoTest2 = “复 印 无 效”;List<String> fileList = findFiles(srcImgPath);
 System.out.println(fileList);

 System.out.println("给图片添加水印文字开始...");

 for(String srcFile : fileList) {
     System.out.println(srcFile);
     System.out.println(srcImgPath);

     String targetFile = srcImgPath + srcFile.substring(srcFile.lastIndexOf("\\"), srcFile.indexOf(".jpg")) + "_Temp.jpg";
     // 给图片添加水印文字,水印文字旋转-45
     markImageByText(logoText, srcFile, targetFile, -45, positionWidth, positionHeight);

     //targetFile = srcFile.substring(0, srcFile.indexOf(".jpg")) + "_rotate.jpg";
     markImageByText(logoTest2, targetFile, targetImgPath + srcFile.substring(srcFile.lastIndexOf("\\")), -45, positionWidth+200, positionHeight+200);

     File file = new File(targetFile);
     file.delete();
 }
 System.out.println("给图片添加水印文字结束...");}
*/
 public static void main(String[] args) {
 String srcImgPath = “F:/test/1.jpg”;
 String logoText = “复 印 无 效”;
 String iconPath = “F:/test/2.jpg”;// String targerTextPath = “F:/test/qie_text.jpg”;
 // String targerTextPath2 = “F:/test/qie_text_rotate.jpg”;// String targerIconPath = “F:/test/qie_icon.jpg”;
 // String targerIconPath2 = “F:/test/qie_icon_rotate.jpg”;
 //
 // System.out.println(“给图片添加水印文字开始…”);
 // // 给图片添加水印文字
 // markImageByText(logoText, srcImgPath, targerTextPath);
 // // 给图片添加水印文字,水印文字旋转-45
 // markImageByText(logoText, srcImgPath, targerTextPath2, -45);
 // System.out.println(“给图片添加水印文字结束…”);
 //
 // System.out.println(“给图片添加水印图片开始…”);
 setImageMarkOptions(0.3f, 1, 1, null, null);
 // // 给图片添加水印图片
 //markImageByIcon(“f:\logo.jpg”, “f:\old\1.jpg”, “f:\old\1991.jpg”);
 // // 给图片添加水印图片,水印图片旋转-45
 markImageByIcon(“f:\logo.jpg”, “f:\old\1.jpg”,“f:\old\199.jpg” , -45);
 // System.out.println(“给图片添加水印图片结束…”);
 //}
 }
 }