转载_纯Java代码批量去除图片文字水印
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等工具查看水印像素所对应的范围。
然后就可以写出一个去水印程序啦。
上代码
- package com.jzhung.demo.core.image;
- import javax.imageio.ImageIO;
- import javax.imageio.ImageWriter;
- import javax.imageio.stream.ImageOutputStream;
- import javax.net.ssl.HttpsURLConnection;
- import java.awt.*;
- import java.awt.image.BufferedImage;
- import java.io.File;
- import java.io.FileFilter;
- 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 java.util.Scanner;
- /**
- * Created by Jzhung on 2017/2/27.
- * 文档图片水印处理
- */
- public class ImageConverter {
- private static List<File> fileList = new ArrayList<File>();
- public static void main(String[] args) {
- System.out.println("输入需要去水印的图片所在的根目录回车(支持递归子目录):");
- Scanner input = new Scanner(System.in);
- String dir = input.nextLine().trim();
- System.out.println("输入转换后的存储目录:");
- String saveDir = input.nextLine().trim();
- System.out.println("输入y开始");
- String comfrm = input.nextLine().trim();
- if (comfrm.equals("y")) {
- convertAllImages(dir, saveDir);
- } else {
- System.out.println("您输入的不是y程序,程序退出");
- }
- /*String dir = "E:\\data\\Desktop";
- String saveDir = "E:\\data\\Desktop-convert";*/
- //replaceFolderImages(dir);
- /*String srcFile = "E:\\data\\image\\img38.png";
- String dstFile = "E:\\data\\image\\img38.png";
- long begin = System.currentTimeMillis();
- repleaceColor(srcFile, dstFile);
- long time = System.currentTimeMillis() - begin;
- System.out.println(time);*/
- }
- 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(), filePath.length());
- System.out.println("converting: " + filePath);
- replaceColor(file.getAbsolutePath(), dstPath);
- }
- }
- public static void loadImages(File f) {
- if (f != null) {
- if (f.isDirectory()) {
- File[] fileArray = f.listFiles();
- if (fileArray != null) {
- for (int i = 0; i < fileArray.length; i++) {
- //递归调用
- loadImages(fileArray[i]);
- }
- }
- } else {
- String name = f.getName();
- if (name.endsWith("png") || name.endsWith("jpg")) {
- fileList.add(f);
- }
- }
- }
- }
- private static void replaceFolderImages(String dir) {
- File dirFile = new File(dir);
- File[] files = dirFile.listFiles(new FileFilter() {
- public boolean accept(File file) {
- String name = file.getName();
- if (name.endsWith("png") || name.endsWith("jpg")) {
- return true;
- }
- return false;
- }
- });
- for (File img : files) {
- replaceColor(img.getAbsolutePath(), img.getAbsolutePath());
- }
- }
- private static void replaceColor(String srcFile, String dstFile) {
- try {
- Color color = new Color(255, 195, 195);
- replaceImageColor(srcFile, dstFile, color, Color.WHITE);
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- public static void replaceImageColor(String file, String dstFile, Color srcColor, Color targetColor) throws IOException {
- URL http;
- if (file.trim().startsWith("https")) {
- http = new URL(file);
- HttpsURLConnection conn = (HttpsURLConnection) http.openConnection();
- conn.setRequestMethod("GET");
- } else if (file.trim().startsWith("http")) {
- http = new URL(file);
- HttpURLConnection conn = (HttpURLConnection) http.openConnection();
- conn.setRequestMethod("GET");
- } else {
- http = new File(file).toURI().toURL();
- }
- BufferedImage bi = ImageIO.read(http.openStream());
- if(bi == null){
- return;
- }
- Color wColor = new Color(255, 255, 255);
- for (int i = 0; i < bi.getWidth(); i++) {
- for (int j = 0; j < bi.getHeight(); j++) {
- //System.out.println(bi.getRGB(i, 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 (greed < 190 || blue < 190) {
- } else {
- if (red == 255 && greed > 180 && blue > 180) {
- bi.setRGB(i, j, wColor.getRGB());
- }
- }
- }
- }
- String type = file.substring(file.lastIndexOf(".") + 1, file.length());
- Iterator<ImageWriter> it = ImageIO.getImageWritersByFormatName(type);
- ImageWriter writer = it.next();
- File f = new File(dstFile);
- f.getParentFile().mkdirs();
- ImageOutputStream ios = ImageIO.createImageOutputStream(f);
- writer.setOutput(ios);
- writer.write(bi);
- bi.flush();
- ios.flush();
- ios.close();
- }
- }
转载_纯Java代码批量去除图片文字水印相关推荐
- java编写流星_纯Java代码实现流星划过天空
废话不多说了,直接给大家贴java代码了. import java.awt.Color; import java.awt.Graphics; import java.awt.image.Buffere ...
- java 错误登陆次数_纯java代码实现登陆次数验证,登陆错误5次之后锁定30分钟
本方法因为是根据思路纯手写,代码可以再简化,功能尝试没问题,最主要就是在登陆验证中的逻辑,checkLogin()方法是登录前的验证,而真正的登陆方式采用的是Shiro,若不是采用Shiro登陆,将该 ...
- java流星雨特效_纯Java代码实现流星划过天空
import java.awt.Color; import java.awt.Graphics; import java.awt.image.BufferedImage; import javax.s ...
- springMVC纯java代码配置(一)- 数据源与事务管理(转载的哦)
原文地址:http://my.oschina.net/devleon/blog/530803?fromerr=9Z8ZFdbf 摘要 自Spring3.0开 始,Spring正式将JavaConfig ...
- 【批量去除图片的背景】
有一个需求,需要批量去除图片的背景,在网上搜到下面这个方法:[python]backgroundremover 去除背景_LiuPig刘皮哥的博客-CSDN博客GitHubhttps://github ...
- 【iText5 生成PDF】纯Java代码实现生成PDF(自定义表格、文本水印、单元格样式)
工作中遇到需要生成PDF.最终选择了iText.其他也有通过html再生成.感觉不太适合就用了代码实现. 使用iText 5.5.13.1版本.纯Java代码实现 1.自定义表格合并指定行列完成数据填 ...
- 基于纯Java代码的Spring容器和Web容器零配置的思考和实现(3) - 使用配置
经过<基于纯Java代码的Spring容器和Web容器零配置的思考和实现(1) - 数据源与事务管理>和<基于纯Java代码的Spring容器和Web容器零配置的思考和实现(2) - ...
- Android --- 使用纯java代码实现相对布局(通俗易懂)
java布局 java代码布局和xml布局的区别 1.Java纯布局更加的灵活,比如自定义控件或一些特殊要求时,使用java代码布局 2.常用的xml布局是所见即所得的编写方式,以及xml本身拥有一些 ...
- Python 3,4行代码实现去除图片背景色,从此告别PS!!
python3实现去除图片背景色 1. removebg工具介绍 2. 去除一张图片的背景色 3. 去除多张图片的背景色 最近博文更新的少,是因为小鱼在备考~~ 闲来无事,弄个证书玩完,关键,好处那是 ...
最新文章
- python实现平衡二叉树_LeetCode 110. 平衡二叉树 | Python
- linux批量创建用户和密码
- .NET Framework 4.0-RequestValidationMode
- nchoosek--二项式系数或所有的组合数
- [BZOJ 4034][HAOI2015]树上操作(欧拉序列+线段树)
- python多个判断条件_Python基础介绍 | 条件判断Conditionals
- 设置log缓存_带你搞明白什么是缓存穿透、缓存击穿、缓存雪崩
- GDUFE ACM-1045
- “ 紫手环的力量 ” :我想,美好的生活应该是自已造就的...
- RabbitMQ,Elasticsearch学习,批量读取消息队列上的数据上传到Elasticsearch
- Atitti 存储引擎支持的国内点与特性attilax总结
- 免费jar包最全下载网站
- 火狐扩展插件开发者模式_使用插件扩展您的开发人员社区
- Alpha-Beta剪枝算法原理
- linux 删除用户 currently logged in,Linux执行usermod时提示user xxx is currently logged in
- 【软件安装使用】pano2vr教程
- 微信抢抢票服务器,2018微信上怎么老是正在抢票?在微信上抢火车票的经验
- 实现调用阿里云API第一章——API请求与认证
- MNE溯源fieldtrip官网教程
- ndarray 与 array 的区别 关系
热门文章
- OpenGL之纹理过滤的四种方式
- LiDARTag:一种基于点云的实时估计基准标记物位姿的系统
- 本题要求实现一个函数,输出n行空心的数字金字塔。
- 什么是计算机网络的组成和功能是什么,计算机网络的组成要素及功能是什么
- c语言入门经典+第5版+习题答案,C语言入门经典(第5版)
- 路由器交换机软件测试,你真的懂集线器、交换机、路由器之间的区别吗?
- C语言取模运算符的妙用
- Couldn‘t terminate the existing process for com.hopechart.gallery
- 四、项目进度管理20题
- 19、L298N 电机驱动板