http://www.oicqzone.com/pc/2017062023844.html

问题

做习题的小伙伴在做试题的时候需要把Word文档中的习题切图制作成试题,由于没注意到Word转出的图片上有很多水印导致制作的资源很不美观。由于涉及的图片数量庞大几千上万张,如果用PS去处理也够我们UI喝一壶的。于是发扬技术解决一切问题的精神写了个图片批量处理水印程序。

效果预览

先看一下原图,是这样的

用程序处理后的结果是介个样子滴:

可以看到,水印基本已经无影无踪了。

分析

要实现这样的一个程序首先要了解关于图像的基本知识。我们平常所看到的JPG,PNG等图像在显示的时候是以像素为单位的。长300宽400像素的图片所有像素为300×400=120000个像素点。在ARGB的图像表示方法中,每个像素点有ARGB四个通道,

A代表透明度,取值范围0~255,

R代表三原色中的红,取值范围0~255,

G代表三原色中的绿,取值范围0~255,

B代表三原色中的蓝,取值范围0~255。

所以存储这些数据只需要4个8位二进制在Java中也就是一个int类型就行啦。所以这张图片显示在屏幕上所占用的内存至少是120000×32个字节。每种颜色都有特定的ARGB取值,所以我们要去除水印就是要把图片中特定范围的ARGB取值改为四个通道取值都是255的白色就行了。有了以上理论知识,再结合Java图像处理相关API,根据目标图像的特征提取出适当ARGB取值范围。可以使用qq或者纳克小工,PS等工具查看水印像素所对应的范围。

然后就可以写出一个去水印程序啦。

上代码

  1. package com.jzhung.demo.core.image;
  2. import javax.imageio.ImageIO;
  3. import javax.imageio.ImageWriter;
  4. import javax.imageio.stream.ImageOutputStream;
  5. import javax.net.ssl.HttpsURLConnection;
  6. import java.awt.*;
  7. import java.awt.image.BufferedImage;
  8. import java.io.File;
  9. import java.io.FileFilter;
  10. import java.io.IOException;
  11. import java.net.HttpURLConnection;
  12. import java.net.URL;
  13. import java.util.ArrayList;
  14. import java.util.Iterator;
  15. import java.util.List;
  16. import java.util.Scanner;
  17. /**
  18. * Created by Jzhung on 2017/2/27.
  19. * 文档图片水印处理
  20. */
  21. public class ImageConverter {
  22. private static List<File> fileList = new ArrayList<File>();
  23. public static void main(String[] args) {
  24. System.out.println("输入需要去水印的图片所在的根目录回车(支持递归子目录):");
  25. Scanner input = new Scanner(System.in);
  26. String dir = input.nextLine().trim();
  27. System.out.println("输入转换后的存储目录:");
  28. String saveDir = input.nextLine().trim();
  29. System.out.println("输入y开始");
  30. String comfrm = input.nextLine().trim();
  31. if (comfrm.equals("y")) {
  32. convertAllImages(dir, saveDir);
  33. } else {
  34. System.out.println("您输入的不是y程序,程序退出");
  35. }
  36. /*String dir = "E:\\data\\Desktop";
  37. String saveDir = "E:\\data\\Desktop-convert";*/
  38. //replaceFolderImages(dir);
  39. /*String srcFile = "E:\\data\\image\\img38.png";
  40. String dstFile = "E:\\data\\image\\img38.png";
  41. long begin = System.currentTimeMillis();
  42. repleaceColor(srcFile, dstFile);
  43. long time = System.currentTimeMillis() - begin;
  44. System.out.println(time);*/
  45. }
  46. private static void convertAllImages(String dir, String saveDir) {
  47. File dirFile = new File(dir);
  48. File saveDirFile = new File(saveDir);
  49. dir = dirFile.getAbsolutePath();
  50. saveDir = saveDirFile.getAbsolutePath();
  51. loadImages(new File(dir));
  52. for (File file : fileList) {
  53. String filePath = file.getAbsolutePath();
  54. String dstPath = saveDir + filePath.substring(filePath.indexOf(dir) + dir.length(), filePath.length());
  55. System.out.println("converting: " + filePath);
  56. replaceColor(file.getAbsolutePath(), dstPath);
  57. }
  58. }
  59. public static void loadImages(File f) {
  60. if (f != null) {
  61. if (f.isDirectory()) {
  62. File[] fileArray = f.listFiles();
  63. if (fileArray != null) {
  64. for (int i = 0; i < fileArray.length; i++) {
  65. //递归调用
  66. loadImages(fileArray[i]);
  67. }
  68. }
  69. } else {
  70. String name = f.getName();
  71. if (name.endsWith("png") || name.endsWith("jpg")) {
  72. fileList.add(f);
  73. }
  74. }
  75. }
  76. }
  77. private static void replaceFolderImages(String dir) {
  78. File dirFile = new File(dir);
  79. File[] files = dirFile.listFiles(new FileFilter() {
  80. public boolean accept(File file) {
  81. String name = file.getName();
  82. if (name.endsWith("png") || name.endsWith("jpg")) {
  83. return true;
  84. }
  85. return false;
  86. }
  87. });
  88. for (File img : files) {
  89. replaceColor(img.getAbsolutePath(), img.getAbsolutePath());
  90. }
  91. }
  92. private static void replaceColor(String srcFile, String dstFile) {
  93. try {
  94. Color color = new Color(255, 195, 195);
  95. replaceImageColor(srcFile, dstFile, color, Color.WHITE);
  96. } catch (IOException e) {
  97. e.printStackTrace();
  98. }
  99. }
  100. public static void replaceImageColor(String file, String dstFile, Color srcColor, Color targetColor) throws IOException {
  101. URL http;
  102. if (file.trim().startsWith("https")) {
  103. http = new URL(file);
  104. HttpsURLConnection conn = (HttpsURLConnection) http.openConnection();
  105. conn.setRequestMethod("GET");
  106. } else if (file.trim().startsWith("http")) {
  107. http = new URL(file);
  108. HttpURLConnection conn = (HttpURLConnection) http.openConnection();
  109. conn.setRequestMethod("GET");
  110. } else {
  111. http = new File(file).toURI().toURL();
  112. }
  113. BufferedImage bi = ImageIO.read(http.openStream());
  114. if(bi == null){
  115. return;
  116. }
  117. Color wColor = new Color(255, 255, 255);
  118. for (int i = 0; i < bi.getWidth(); i++) {
  119. for (int j = 0; j < bi.getHeight(); j++) {
  120. //System.out.println(bi.getRGB(i, j));
  121. int color = bi.getRGB(i, j);
  122. Color oriColor = new Color(color);
  123. int red = oriColor.getRed();
  124. int greed = oriColor.getGreen();
  125. int blue = oriColor.getBlue();
  126. //粉色
  127. if (greed < 190 || blue < 190) {
  128. } else {
  129. if (red == 255 && greed > 180 && blue > 180) {
  130. bi.setRGB(i, j, wColor.getRGB());
  131. }
  132. }
  133. }
  134. }
  135. String type = file.substring(file.lastIndexOf(".") + 1, file.length());
  136. Iterator<ImageWriter> it = ImageIO.getImageWritersByFormatName(type);
  137. ImageWriter writer = it.next();
  138. File f = new File(dstFile);
  139. f.getParentFile().mkdirs();
  140. ImageOutputStream ios = ImageIO.createImageOutputStream(f);
  141. writer.setOutput(ios);
  142. writer.write(bi);
  143. bi.flush();
  144. ios.flush();
  145. ios.close();
  146. }
  147. }

转载_纯Java代码批量去除图片文字水印相关推荐

  1. java编写流星_纯Java代码实现流星划过天空

    废话不多说了,直接给大家贴java代码了. import java.awt.Color; import java.awt.Graphics; import java.awt.image.Buffere ...

  2. java 错误登陆次数_纯java代码实现登陆次数验证,登陆错误5次之后锁定30分钟

    本方法因为是根据思路纯手写,代码可以再简化,功能尝试没问题,最主要就是在登陆验证中的逻辑,checkLogin()方法是登录前的验证,而真正的登陆方式采用的是Shiro,若不是采用Shiro登陆,将该 ...

  3. java流星雨特效_纯Java代码实现流星划过天空

    import java.awt.Color; import java.awt.Graphics; import java.awt.image.BufferedImage; import javax.s ...

  4. springMVC纯java代码配置(一)- 数据源与事务管理(转载的哦)

    原文地址:http://my.oschina.net/devleon/blog/530803?fromerr=9Z8ZFdbf 摘要 自Spring3.0开 始,Spring正式将JavaConfig ...

  5. 【批量去除图片的背景】

    有一个需求,需要批量去除图片的背景,在网上搜到下面这个方法:[python]backgroundremover 去除背景_LiuPig刘皮哥的博客-CSDN博客GitHubhttps://github ...

  6. 【iText5 生成PDF】纯Java代码实现生成PDF(自定义表格、文本水印、单元格样式)

    工作中遇到需要生成PDF.最终选择了iText.其他也有通过html再生成.感觉不太适合就用了代码实现. 使用iText 5.5.13.1版本.纯Java代码实现 1.自定义表格合并指定行列完成数据填 ...

  7. 基于纯Java代码的Spring容器和Web容器零配置的思考和实现(3) - 使用配置

    经过<基于纯Java代码的Spring容器和Web容器零配置的思考和实现(1) - 数据源与事务管理>和<基于纯Java代码的Spring容器和Web容器零配置的思考和实现(2) - ...

  8. Android --- 使用纯java代码实现相对布局(通俗易懂)

    java布局 java代码布局和xml布局的区别 1.Java纯布局更加的灵活,比如自定义控件或一些特殊要求时,使用java代码布局 2.常用的xml布局是所见即所得的编写方式,以及xml本身拥有一些 ...

  9. Python 3,4行代码实现去除图片背景色,从此告别PS!!

    python3实现去除图片背景色 1. removebg工具介绍 2. 去除一张图片的背景色 3. 去除多张图片的背景色 最近博文更新的少,是因为小鱼在备考~~ 闲来无事,弄个证书玩完,关键,好处那是 ...

最新文章

  1. python实现平衡二叉树_LeetCode 110. 平衡二叉树 | Python
  2. linux批量创建用户和密码
  3. .NET Framework 4.0-RequestValidationMode
  4. nchoosek--二项式系数或所有的组合数
  5. [BZOJ 4034][HAOI2015]树上操作(欧拉序列+线段树)
  6. python多个判断条件_Python基础介绍 | 条件判断Conditionals
  7. 设置log缓存_带你搞明白什么是缓存穿透、缓存击穿、缓存雪崩
  8. GDUFE ACM-1045
  9. “ 紫手环的力量 ” :我想,美好的生活应该是自已造就的...
  10. RabbitMQ,Elasticsearch学习,批量读取消息队列上的数据上传到Elasticsearch
  11. Atitti 存储引擎支持的国内点与特性attilax总结
  12. 免费jar包最全下载网站
  13. 火狐扩展插件开发者模式_使用插件扩展您的开发人员社区
  14. Alpha-Beta剪枝算法原理
  15. linux 删除用户 currently logged in,Linux执行usermod时提示user xxx is currently logged in
  16. 【软件安装使用】pano2vr教程
  17. 微信抢抢票服务器,2018微信上怎么老是正在抢票?在微信上抢火车票的经验
  18. 实现调用阿里云API第一章——API请求与认证
  19. MNE溯源fieldtrip官网教程
  20. ndarray 与 array 的区别 关系

热门文章

  1. OpenGL之纹理过滤的四种方式
  2. LiDARTag:一种基于点云的实时估计基准标记物位姿的系统
  3. 本题要求实现一个函数,输出n行空心的数字金字塔。
  4. 什么是计算机网络的组成和功能是什么,计算机网络的组成要素及功能是什么
  5. c语言入门经典+第5版+习题答案,C语言入门经典(第5版)
  6. 路由器交换机软件测试,你真的懂集线器、交换机、路由器之间的区别吗?
  7. C语言取模运算符的妙用
  8. Couldn‘t terminate the existing process for com.hopechart.gallery
  9. 四、项目进度管理20题
  10. 19、L298N 电机驱动板