一种自动去除图片水印的方法
阅读说明:本技术 一种自动去除图片水印的方法 (Method for automatically removing image watermark ) 是由 丁继锋 张来卿 庞严冬 于 2018-09-07 设计创作,主要内容包括:本发明涉及Web应用与开发技术领域,具体涉及一种自动去除图片水印的方法。本发明所述的方法包含以下几个步骤:1、加载并读取所有要处理的图片;2、筛选并过滤图片;3、将图片加载到图像缓冲区并替换图片水印;4、输出并保存替换水印后图片。本发明解决了除图片水印自动化的问题,以及除水印需要借助第三方工具,操作繁琐、效果差、效率低的问题,可广泛应用于WEB应用与开发中。(The invention relates to the technical field of Web application and development, in particular to a method for automatically removing a picture watermark. The method comprises the following steps: 1. loading and reading all pictures to be processed; 2. screening and filtering pictures; 3. loading the picture into an image buffer area and replacing the picture watermark; 4. and outputting and storing the picture after replacing the watermark. The invention solves the problems of automation of image watermark removal, the need of a third-party tool for removing the watermark, complex operation, poor effect and low efficiency, and can be widely applied to WEB application and development.)
技术领域
本发明涉及Web应用与开发技术领域,具体涉及一种自动去除图片水印的方法。
背景技术
水印是一种数字信息的保护手段。所谓水印是向数据多媒体(如图像、声音、视频信号等)中添加某些数字信息以达到文件真伪鉴别、版权保护等功能。嵌入的水印信息隐藏于宿主文件中,不影响原始文件的可观性和完整性。
我们平常所看到的JPG,PNG等图像在显示的时候是以像素为单位的。在ARGB的图像表示方法中,每个像素点有ARGB四个通道,A代表透明度,取值范围0~255,R代表三原色中的红,取值范围0~255,G代表三原色中的绿,取值范围0~255,B代表三原色中的蓝,取值范围0~255。所以存储这些数据只需要4个8位二进制也就是一个int类型就可以了。每种颜色都有特定的ARGB取值,要去除水印就是要把图片中特定范围的ARGB取值改为四个通道取值都是255的白色就行了。
通常情况下在图片除水印很困难,且需要借助第三方工具,操作繁琐,效果差,效率低。本发明通过程序自动识别图片水印,并进行处理替换,解决了除图片水印自动化的问题,以及除水印需要借助第三方工具,操作繁琐、效果差、效率低的问题,可广泛应用于WEB应用与开发过程中。
发明内容
本发明解决的技术问题在于提供一种自动去除图片水印的方法;解决了除图片水印自动化的问题,以及除水印需要借助第三方工具,操作繁琐、效果差、效率低的问题。
本发明解决上述技术问题的技术方案是:
所述的方法包含以下几个步骤:
步骤一、加载并读取所有要处理的图片;
步骤二、筛选并过滤图片;
步骤三、将图片加载到图像缓冲区并替换图片水印;
步骤四、输出并保存替换水印后图片。
所述的自动去除图片水印的方法,步骤一中,加载并读取所有要处理的图片,可以直接选中多张图片读取,也可以通过图片存放目录进行读取,读取后转换成图片对象并保存于集合中。
所述的步骤二中,筛选过滤图片,循环步骤一的图片集合,过滤掉非JPG,PNG格式图片,分别读取水印颜色和背景色进行保存,过滤后图片保存于新集合中。
所述的步骤三中,循环步骤二中图片集合,将图片加载到图像缓冲区,以图片宽度和高度进行双层循环,逐一获取每一像素的颜色,判断颜色值是否为水印颜色,若是水印颜色则设置当前像素的颜色为当前图片的背景色,反之不作处理。
所述的步骤四中,替换完步骤三中的水印后,重新读取图片缓冲区数据,并转换成图片对象,输出图片并保存。
本发明解决了除图片水印自动化的问题,以及除水印需要借助第三方工具,操作繁琐、效果差、效率低的问题,可广泛应用于WEB应用和开发过程中。
附图说明
下面结合附图对本发明进一步说明:
图1是本发明方法流程图。
具体实施方式
如图1所示,本发明具体包含以下几个步骤 :
步骤一、加载并读取所有要处理的图片;
步骤二、筛选并过滤图片;
步骤三、将图片加载到图像缓冲区并替换图片水印;
步骤四、输出并保存替换水印后图片。
所述的步骤一中,加载并读取所有要处理的图片,可以直接选中多张图片读取,也可以通过图片存放目录进行读取,读取后转换成图片对象并保存于集合中。
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); } } }}
所述的步骤二中,筛选过滤图片,循环步骤一的图片集合,过滤掉非JPG,PNG格式图片,分别读取水印颜色和背景色进行保存,过滤后图片保存于新集合中。
private static void replaceFolderImages(String dir) { FiledirFile = new File(dir); File[] files = dirFile.listFiles(newFileFilter() { 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()); } }
所述的步骤三中,循环步骤二中图片集合,将图片加载到图像缓冲区,以图片宽度和高度进行双层循环,逐一获取每一像素的颜色,判断颜色值是否为水印颜色,若是水印颜色则设置当前像素的颜色为当前图片的背景色,反之不作处理。
//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()。
- 上一篇:一种医用注射器针头装配设备
- 下一篇:水印嵌入和水印提取方法、装置及设备