| package com.doumee.core.utils; | 
| import java.awt.*; | 
| import java.awt.image.BufferedImage; | 
|   | 
| import java.io.File; | 
| import java.io.IOException; | 
| import java.net.HttpURLConnection; | 
| import java.net.URL; | 
| import java.util.ArrayList; | 
| import java.util.Iterator; | 
| import java.util.List; | 
|   | 
| import javax.imageio.ImageIO; | 
| import javax.imageio.ImageWriter; | 
| import javax.imageio.stream.ImageOutputStream; | 
| import javax.net.ssl.HttpsURLConnection; | 
|   | 
| public class ImageUtil { | 
|     private static List<File> fileList = new ArrayList<>(); | 
|   | 
|     public static void main(String[] args) { | 
|         //convertAllImages("F:\\before.png", "F:\\after.png"); | 
|         fileList.add(new File("C:\\Users\\T14\\Desktop\\1\\1.jpg")); | 
|         convertAllImages(fileList); | 
|     } | 
|   | 
|     /** | 
|      * 去除文件列表里图片的水印并替换 | 
|      * | 
|      * @Param fileList 文件列表 | 
|      */ | 
|     public static void convertAllImages(List<File> fileList) { | 
|         try { | 
|             for (File file : fileList) { | 
|                 if (!file.getName().endsWith("png") && !file.getName().endsWith("jpg")) { | 
|                     continue; | 
|                 } | 
|                 BufferedImage bi = ImageIO.read(file); //用ImageIO流读取像素块 | 
|                 if (bi != null) { | 
|                     removeWatermark(bi); | 
|                     String formatName = file.getName().substring(file.getName().lastIndexOf(".") + 1);//生成的图片格式 | 
|                     ImageIO.write(bi, formatName, file);//用ImageIO流生成的处理图替换原图片 | 
|                 } | 
|             } | 
|         } catch (IOException e) { | 
|             e.printStackTrace(); | 
|         } | 
|     } | 
|   | 
|     /** | 
|      * 从源目录获取图片处理后导出到目标目录 | 
|      * | 
|      * @param dir     源目录 | 
|      * @param saveDir 目标目录 | 
|      */ | 
|     private static void convertAllImages(String dir, String saveDir) { | 
|         File dirFile = new File(dir); | 
|         File saveDirFile = new File(saveDir); | 
|         dir = dirFile.getAbsolutePath(); | 
|         saveDir = saveDirFile.getAbsolutePath(); | 
|         loadImages(new File(dir)); | 
|         for (File file : fileList) { | 
|             String filePath = file.getAbsolutePath(); | 
|             String dstPath = saveDir + filePath.substring(filePath.indexOf(dir) + dir.length()); | 
|             replace(file.getAbsolutePath(), dstPath); | 
|         } | 
|     } | 
|   | 
|     /** | 
|      * 加载图片 | 
|      */ | 
|     private static void loadImages(File f) { | 
|         if (f != null) { | 
|             if (f.isDirectory()) { | 
|                 File[] fileArray = f.listFiles(); | 
|                 if (fileArray != null) { | 
|                     for (File file : fileArray) { | 
|                         loadImages(file); //递归调用 | 
|                     } | 
|                 } | 
|             } else { | 
|                 String name = f.getName(); | 
|                 if (name.endsWith("png") || name.endsWith("jpg")) { | 
|                     fileList.add(f); | 
|                 } | 
|             } | 
|         } | 
|     } | 
|   | 
|     /** | 
|      * 生成源图片的处理图 | 
|      * | 
|      * @param srcFile 源图片路径 | 
|      * @param dstFile 目标图片路径 | 
|      */ | 
|     private static void replace(String srcFile, String dstFile) { | 
|         try { | 
|             URL http; | 
|             if (srcFile.trim().startsWith("https")) { | 
|                 http = new URL(srcFile); | 
|                 HttpsURLConnection conn = (HttpsURLConnection) http.openConnection(); | 
|                 conn.setRequestMethod("GET"); | 
|             } else if (srcFile.trim().startsWith("http")) { | 
|                 http = new URL(srcFile); | 
|                 HttpURLConnection conn = (HttpURLConnection) http.openConnection(); | 
|                 conn.setRequestMethod("GET"); | 
|             } else { | 
|                 http = new File(srcFile).toURI().toURL(); | 
|             } | 
|             BufferedImage bi = ImageIO.read(http.openStream()); | 
|             if (bi != null) { | 
|                 removeWatermark(bi); | 
|                 exportImage(bi, srcFile, dstFile); | 
|             } | 
|         } catch (IOException e) { | 
|             e.printStackTrace(); | 
|         } | 
|     } | 
|   | 
|     /** | 
|      * 由ImageIO流生成源图片的处理图 | 
|      * | 
|      * @param bi       ImageIO | 
|      * @param fileName 源图片带后缀的文件名 | 
|      * @param dstFile  目标图片路径 | 
|      */ | 
|     private static void exportImage(BufferedImage bi, String fileName, String dstFile) { | 
|         try { | 
|             String type = fileName.substring(fileName.lastIndexOf(".") + 1); | 
|             Iterator<ImageWriter> it = ImageIO.getImageWritersByFormatName(type); | 
|             ImageWriter writer = it.next(); | 
|             File f = new File(dstFile); | 
|             ImageOutputStream ios = ImageIO.createImageOutputStream(f); | 
|             writer.setOutput(ios); | 
|             writer.write(bi); | 
|             bi.flush(); | 
|             ios.flush(); | 
|             ios.close(); | 
|         } catch (IOException e) { | 
|             e.printStackTrace(); | 
|         } | 
|     } | 
|   | 
|     /** | 
|      * 去除水印 | 
|      */ | 
|     private static void removeWatermark(BufferedImage bi) { | 
|         Color wColor = new Color(197, 196, 191); | 
|         Color hColor = new Color(140, 88, 100); | 
| //        Color wColor = new Color(254, 254, 254); | 
| //        Color hColor = new Color(197, 196, 191); | 
|         //白底水印 | 
|         for (int i = 0; i < bi.getWidth(); i++) { | 
|             for (int j = 0; j < bi.getHeight(); j++) { | 
|                 int color = bi.getRGB(i, j); | 
|                 Color oriColor = new Color(color); | 
|                 int red = oriColor.getRed(); | 
|                 int greed = oriColor.getGreen(); | 
|                 int blue = oriColor.getBlue(); | 
|                 if (red == 254 && greed == 254 && blue == 254) { | 
|                     continue; | 
|                 } | 
|                 if (red > 220 && greed > 180 && blue > 80) { | 
|                     bi.setRGB(i, j, wColor.getRGB()); | 
|                 } | 
|                 if (red <= 240 && greed >= 200 && blue >= 150) { | 
|                     bi.setRGB(i, j, wColor.getRGB()); | 
|                 } | 
|             } | 
|         } | 
|     } | 
| } |