`

java去除图片水印的解决办法

    博客分类:
  • java
阅读更多
原文地址:http://www.oicqzone.com/pc/2017062023844.html


去除水印: 其实就是把水印的颜色替换为背景色(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等工具查看水印像素所对应的范围。
* */



打开图片->选择画图方式打开,然后用吸管工具点你要的地方。右上方有个 编辑颜色,点击后看到的颜色就是你选取的。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中处理图片水印

    在Java编程语言中,处理图片水印涉及到图像处理和图形绘制技术。`Graphics2D`是Java 2D API的一部分,它提供了丰富的功能,可以用来在图像上添加文本、图像等元素,实现水印效果。下面我们将深入探讨如何使用`...

    采用java实现图片水印

    本篇文章将详细探讨如何使用Java实现图片水印的添加,以及相关的知识点。 首先,我们需要了解Java中的图像处理库。Java标准库提供了`java.awt`和`javax.imageio`包,它们包含了处理图像的基本功能。`java.awt`包中...

    Aspose for Java 去除水印和数量限制

    去除水印的方法取决于水印的类型和添加方式。对于文本水印,可以通过遍历文档的段落和字符来定位并删除特定的文本;对于图像水印,可能需要查找并移除特定的图形对象。Aspose for Java提供了API来访问和操作这些元素...

    去除pdf的图片水印和文字水印

    使用itext开发包对pdf文件进行去水印操作,包括删除图片水印和文字水印。通过遍历pdf的contents对象和xobjects对象,进行对象删除,速度快,效率高

    JAVA处理图片 加文字水印以及灰色透明背景

    JAVA处理图片 加文字水印以及灰色透明背景,处理图片。

    如何通过javacv实现图片去水印(附代码)

    这个示例代码首先使用JavaCV读取图片,然后使用OpenCV的功能来检测水印,并最终删除水印。这个示例代码非常详细,对大家的学习或者工作具有一定的参考学习价值。 JavaCV是一个功能强大且实用的计算机视觉库,能够...

    水印 java Graphics2D实现文字图片水印

    在Java编程语言中,添加文字或图片水印是一项常见的任务,尤其在处理图像处理和多媒体应用时。Graphics2D是Java 2D API的一部分,它提供了丰富的绘图和图形操作功能,包括添加水印到图像。下面将详细介绍如何使用...

    java aspose文件转化-去水印(保证可用)

    本教程将聚焦于使用Aspose进行文件转换以及去除PDF中的水印。 首先,我们来看`aspose-words-20.1-jdk17.jar`这个文件。这是Aspose.Words for Java的一个版本,专门用于处理Word文档。它包含了所有必要的类和方法,...

    java图片加水印及图片加解密

    - **目的**:在图片上添加水印后,为了保护水印不被篡改或去除,可以对含有水印的图片进行加密。 - **实现**:可以先添加水印,然后对整个图片进行加密。这样即使有人尝试解密图片,水印信息也会保留下来,增加了...

    图像数字水印的JAVA实现

    6. **安全性考虑**:为了防止水印被篡改或去除,可以采用加密技术对水印进行保护。例如,使用公钥加密算法,只有持有私钥的拥有者才能解密并验证水印。 7. **实际应用**:除了版权保护,数字水印还可以应用于多媒体...

    dct-watermark-master.zip_Java 图片水印_数字水印_水印_水印 拷贝_水印检测

    Java图片水印技术是软件开发中的一个重要领域,主要用于在图像上添加不可见或可见的标记,以实现版权保护、防止非法拷贝以及进行水印检测。在这个“dct-watermark-master.zip”压缩包中,我们可以预见到包含了一个...

    aspose-cells-8.5.0-java 去水印特别版

    aspose-cells-8.5.0-java版,随手修改了License文件,去掉了导出图片的水印。仅供个人学习使用,不要用于商业版本。

    JAVA PDF转图片 ICEpdf-pro-5.0.6-P01 去水印 jar文件附带实例

    使用Icepdf 5.0.6 P01最新版PDF转图片,附带jar包和转换demo实例工具类,并且完美去水印。详细去水印方法请看我的博客文章http://blog.csdn.net/wangpeng468/article/details/37810445

    java操作水印的jar包

    Java操作水印的jar包主要用于在PDF、Word文档和图片上添加水印,这是一种常见的文件保护和版权声明方法。在Java编程中,处理水印涉及多个技术领域,包括IO流处理、图像处理、文档解析等。下面将详细介绍这些知识点。...

    图片水印去除工具下载

    在IT领域,图片水印去除是一项常见的图像处理任务,尤其对于那些希望纯净展示图像或进行二次创作的人来说。本文将深入探讨“图片水印去除工具”的使用及其相关技术。 标题中的“图片水印去除工具下载”指的是一个...

    word转图片新jar可去除水印

    总的来说,这个“word转图片新jar可去除水印”的解决方案提供了一种便捷的方法,解决了在Word到图片转换过程中水印去除的问题。对于需要处理大量无水印图片的开发者或企业来说,这是一个非常有价值的工具。在实际...

    icepdf转图片 去水印,解决字体乱码

    在实际操作中,要使用icepdf去除PDF水印和解决字体乱码,你需要做以下步骤: 1. **引入icepdf库**:首先,你需要将ICEpdf-pro-6.2.3压缩包解压,并在项目中添加icepdf的依赖,通常是JAR文件或者通过Maven、Gradle等...

    aspose-words-15.8jar以及去除水印

    Aspose.Words提供了一套API接口,能够方便地处理文档中的水印,无论是文本水印还是图像水印,都可以通过编程方式轻松去除。 首先,你需要在项目中引入aspose-words-15.8.jar库,确保你的开发环境支持Java,并且在...

    PDF文件JAVA去水印源码-Itextsharp:iTextSharp,.NETPDF库

    PDF文件JAVA去水印源码锐化 iText 是一个 PDF 库,允许您以可移植文档格式 (PDF) 创建、改编、检查和维护文档: 根据 XML 文件或数据库中的数据生成文档和报告 创建地图和书籍,利用 PDF 中提供的众多交互功能 向...

    java 指定url地址生成二维码(去白边、添加水印、添加logo(圆形/方形))

    如果你想添加圆形Logo,可以使用`java.awt.geom.Ellipse2D`来创建一个圆形区域,然后应用`g2d.clip()`方法限制绘制区域。 6. **保存图像** 最后,将处理后的图像保存到文件: ```java ImageIO.write...

Global site tag (gtag.js) - Google Analytics