java批量图片设置成正方形 添加图片或者文字水印

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(“给图片添加水印图片结束…”);
//}
}
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值