原文地址:http://www.oicqzone.com/pc/2017062023844.html

[color=red]去除水印: 其实就是把水印的颜色替换为背景色(ARGB)

/**
*
* 分析
要实现这样的一个程序首先要了解关于图像的基本知识。我们平常所看到的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等工具查看水印像素所对应的范围。
* */[/color]

打开图片->选择[color=blue]画图方式打开[/color],然后用[color=blue]吸管工具[/color]点你要的地方。右上方有个[color=blue] 编辑颜色[/color],点击后看到的颜色就是你选取的。RGB值显示了。

package com.ocr.demo;

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;

public class ImageConverter {

private static List<File> fileList = new ArrayList<File>();

public static void main(String[] args) {

//图片所在的根目录 , 图片去除水印后的存储目录
convertAllImages("F:\\images\\xunlian\\yzzz.png", "F:\\images\\xunlian\\yzzz2.png"); //支持批量去除图片水印
// convertAllImages("F:\\images\\yyzz", "F:\\images\\yyzz2");
}

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);//白色
Color wColor = new Color(238, 243, 249);//浅灰色
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());
// }
//去掉灰色水印(灰色替换为白色)
// if (red == 229 && greed == 229 && blue == 229) {
// bi.setRGB(i, j, wColor.getRGB());
// }
//去掉浅灰色水印(灰色替换为白色或替换为浅灰色)
if (red >170 && greed > 170 && blue > 170) {
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去除图片水印的解决办法相关推荐

  1. 计算机画图水印怎么可以消除,win10系统使用画图功能去除图片水印的解决步骤...

    win10系统使用久了,好多网友反馈说关于对win10系统使用画图功能去除图片水印设置的方法,在使用win10系统的过程中经常不知道如何去对win10系统使用画图功能去除图片水印进行设置,有什么好的办 ...

  2. 基于多元线性回归去除图片水印(Java版)

    前提 采集的图片有淡淡的水印,为了避免不必要的麻烦,需要淡化或去除水印.图片如下所示: Java自带的工具可以对图片指定位置(x,y)的颜色(r,g,b)进行替换.如果图片上下左右颜色一致,则可进行颜 ...

  3. Java使用ffmpeg去除图片水印

    /*** 去除图片水印*/@Testpublic void deleteLogo(){/*** 对delogo滤镜的说明:- x,y:水印的左上方坐标- w,h: 水印的宽高- show: 可选参数, ...

  4. 教你一招利用Python快速去除图片水印

    大家好,我是IT界搬运工. 相信大家都有在网上下载好图片但是有水印的烦恼,那么问题就来了:看到心爱的图片想要"占为己有".怎么把图片上的水印去除呢?今天我就来教你一招利用Pytho ...

  5. Eclipse 报 “Exception in thread main java.lang.OutOfMemoryError: Java heap space ”错误的解决办法

    Eclipse 报 "Exception in thread "main" java.lang.OutOfMemoryError: Java heap space &qu ...

  6. Eclipse 报 “Exception in thread main java.lang.OutOfMemoryError: Java heap space ”错误的解决办法...

    Eclipse 报 "Exception in thread "main" java.lang.OutOfMemoryError: Java heap space &qu ...

  7. 去除图片水印_只需一键,即可快速去除图片水印!如此简单的方法,谁不知谁吃亏...

    现在有很多小伙伴都会到网上找一些好看的图片保存下来,但是很多时候我们找到的图片都是带有水印的,虽然水印很小,但是看起来也是怪怪的.别担心,今天小编将分享几个简单又好用的图片去水印方法给大家,有需要的小 ...

  8. Android之运行Java.lang.UnsatisfiedLinkError的错误解决办法

    1.问题 部分手机运行的时候在jni层出现这个错误,导致手机崩溃 Java.lang.UnsatisfiedLinkError 2.解决办法 是因为在我是这样写的 static {System.loa ...

  9. java文件下载出现文件名乱码解决办法

    java文件下载出现文件名乱码解决办法 //IE.chrom.Firefox文件中文乱码问题public String processFileName(HttpServletRequest reque ...

最新文章

  1. SpringMVC的国际化
  2. TransmittableThreadLocal详解
  3. Java常见面试题之类的加载过程
  4. C语言(CED)判断一个数是否是2的整数幂的简便方法!
  5. Ubuntu提示软件更新
  6. JSpider(3):JSpider的结构
  7. docker启动nginx代理不上_用 docker-compose 启动 nginx, network 为 host, nginx 无法启动是怎么回事?...
  8. python 数据分析与挖局书籍
  9. 【微软商店(Microsoft Store)重置后打不开,商店下载不了应用的解决方法】
  10. C++ stringstream 从字符串中分离单词
  11. 码蹄集第23周赛(买礼物,召唤神龙,大促销,轨道探测)
  12. Linux系统网络环境配置(初学者必看)!!
  13. 树莓派配置IP地址和wifi方法
  14. 原型设计(结对第一次)--社团管理系统
  15. javaSE探赜索隐之三<类与对象的爱恨情仇中>
  16. 怎么查看一段时间的计算机ip,如何查看电脑中使用过的历史IP地址
  17. Top命令查询结果界面参数详解
  18. C++晋升之图像采集(我也略懂皮毛)
  19. 【IT】计算机体系结构
  20. 两台计算机直接相连教程,两台电脑怎么连接局域网,小编告诉你两台电脑怎么连接局域网...

热门文章

  1. 俺常去(用)滴地方~
  2. 电脑是由哪几种设备组成的
  3. iPhoneX炫彩壁纸背景demo(含动效)
  4. 笔记本无线连接打印机
  5. Suzy找到实习了吗Day 11 |栈与队列中途 20. 有效的括号,1047. 删除字符串中的所有相邻重复项,150. 逆波兰表达式求值
  6. ICC Floorplan遇到的坑以及解决方法
  7. 怎么退出自适应巡航_买车选配置,自适应巡航or定速巡航
  8. 自适应巡航控制算法ACC 自适应巡航控制算法 由控制层和执行层组成
  9. (转载自)章文嵩博士和他背后的负载均衡帝国
  10. Dialog 对话框