最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java去除圖片水印的四種方法實(shí)現(xiàn)與對(duì)比

 更新時(shí)間:2025年08月29日 08:34:45   作者:悟能不能悟  
這篇文章將從簡(jiǎn)單到復(fù)雜,為大家詳細(xì)介紹幾種常見(jiàn)的 Java 去水印方法、適用的場(chǎng)景以及需要注意的事項(xiàng),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解下

下面我將從簡(jiǎn)單到復(fù)雜,介紹幾種常見(jiàn)的 Java 去水印方法、適用的場(chǎng)景以及需要注意的事項(xiàng)。

核心思路

去水印的本質(zhì)是:?用合理的背景內(nèi)容替換水印區(qū)域的像素。

方法一:覆蓋或裁剪(適用于簡(jiǎn)單情況)

這種方法不算是真正的“去除”,而是遮蓋或移除。

?1.使用純色塊覆蓋?:

?場(chǎng)景?:水印位于純色背景上(例如,純白色背景上的灰色文字水印)。

?方法?:確定水印的位置和大小,然后用背景色(如白色)填充該矩形區(qū)域。

?代碼示例(使用 Java AWT)??:

import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import javax.imageio.ImageIO;
 
public class WatermarkRemover {
    public static void coverWatermark(String inputPath, String outputPath, Rectangle watermarkArea) throws Exception {
        // 讀取原始圖片
        BufferedImage originalImage = ImageIO.read(new File(inputPath));
        Graphics2D g = originalImage.createGraphics();
 
        // 設(shè)置覆蓋顏色(這里假設(shè)背景是白色)
        g.setColor(Color.WHITE);
        // 填充水印區(qū)域
        g.fillRect(watermarkArea.x, watermarkArea.y, watermarkArea.width, watermarkArea.height);
        g.dispose();
 
        // 保存處理后的圖片
        ImageIO.write(originalImage, "png", new File(outputPath));
    }
 
    public static void main(String[] args) throws Exception {
        // 假設(shè)水印在 (100, 100) 的位置,大小為 200x50
        Rectangle area = new Rectangle(100, 100, 200, 50);
        coverWatermark("input.jpg", "output_covered.png", area);
    }
}

?裁剪?:

  • ?場(chǎng)景?:水印位于圖片邊緣,且圖片核心內(nèi)容不在邊緣。
  • ?方法?:使用 BufferedImage.getSubimage截取沒(méi)有水印的區(qū)域。

方法二:顏色處理/色差過(guò)濾(適用于特定顏色水印)

?場(chǎng)景?:水印顏色與背景主體顏色有較大差異(例如,彩色 圖片上的灰色或白色半透明水?。?。

?原理?:遍歷每個(gè)像素,識(shí)別出水印顏色特征的像素,然后將其替換為背景色或進(jìn)行淡化處理。

?方法?:

  • ?顏色替換?:直接判斷像素 RGB 值,如果接近水印顏色(在一定容差范圍內(nèi)),則用近似背景色替換。
  • ?提高亮度/降低對(duì)比度?:對(duì)于白色半透明水印,可以嘗試提高水印區(qū)域的亮度并降低對(duì)比度來(lái)使其淡化。

?代碼示例(顏色替換思路)??:

public static void removeColorWatermark(String inputPath, String outputPath, Color watermarkColor, int tolerance) throws Exception {
    BufferedImage image = ImageIO.read(new File(inputPath));
    int width = image.getWidth();
    int height = image.getHeight();
 
    // 水印顏色的RGB分量
    int wmRed = watermarkColor.getRed();
    int wmGreen = watermarkColor.getGreen();
    int wmBlue = watermarkColor.getBlue();
 
    for (int y = 0; y < height; y++) {
        for (int x = 0; x < width; x++) {
            int pixel = image.getRGB(x, y);
            Color color = new Color(pixel, true);
 
            int red = color.getRed();
            int green = color.getGreen();
            int blue = color.getBlue();
 
            // 計(jì)算當(dāng)前顏色與水印顏色的歐幾里得距離(簡(jiǎn)化版)
            double distance = Math.sqrt(
                Math.pow(red - wmRed, 2) +
                Math.pow(green - wmGreen, 2) +
                Math.pow(blue - wmBlue, 2)
            );
 
            // 如果顏色足夠接近水印色,則用周圍像素的平均值替換(這里簡(jiǎn)化了,直接用白色)
            if (distance < tolerance) {
                // 更高級(jí)的做法是取周圍非水印像素的平均值
                image.setRGB(x, y, Color.WHITE.getRGB());
            }
        }
    }
    ImageIO.write(image, "png", new File(outputPath));
}

?缺點(diǎn)?:對(duì)于復(fù)雜背景(如紋理、漸變),效果很差,很容易留下明顯的涂抹痕跡。

方法三:使用專業(yè)圖像處理庫(kù)(OpenCV)

這是最強(qiáng)大、最專業(yè)的方法。OpenCV 提供了豐富的圖像處理函數(shù),可以實(shí)現(xiàn)更智能的去水印算法。

?常見(jiàn)技術(shù)?:

?圖像修復(fù)(Inpainting)??:這是 OpenCV 的直接解決方案。你提供一個(gè)“掩膜(Mask)”(一個(gè)指明水印位置的二值圖),算法會(huì)根據(jù)周圍像素信息智能地填充水印區(qū)域。

  • Imgproc.INPAINT_TELEA算法
  • Imgproc.INPAINT_NS算法

?圖像插值?:結(jié)合邊緣檢測(cè)和區(qū)域填充。

?步驟?:

  • 在 Java 項(xiàng)目中引入 OpenCV 庫(kù)。
  • 讀取圖片和水印位置的掩膜圖。
  • 調(diào)用 Photo.inpaint方法。

?代碼示例(使用 OpenCV)??:

import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.photo.Photo;
 
public class OpenCVWatermarkRemoval {
    public static void main(String[] args) {
        // 加載 OpenCV 本地庫(kù)
        System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
 
        // 1. 讀取原始圖像
        Mat src = Imgcodecs.imread("input.jpg");
        // 2. 讀取掩膜圖像(必須是8位單通道灰度圖)
        //    掩膜圖中:水印區(qū)域?yàn)榘咨?55),其他區(qū)域?yàn)楹谏?)
        Mat mask = Imgcodecs.imread("watermark_mask.png", Imgcodecs.IMREAD_GRAYSCALE);
 
        // 3. 創(chuàng)建用于存儲(chǔ)結(jié)果的Mat
        Mat dst = new Mat();
 
        // 4. 進(jìn)行圖像修復(fù)
        Photo.inpaint(src, mask, dst, 3, Photo.INPAINT_TELEA);
 
        // 5. 保存結(jié)果
        Imgcodecs.imwrite("output_inpainted.jpg", dst);
    }
}

?關(guān)鍵?:?制作精準(zhǔn)的掩膜(Mask)是成功的關(guān)鍵。你需要另一個(gè)程序或手動(dòng)工作來(lái)精確標(biāo)出圖片上的水印區(qū)域。

方法四:克隆或內(nèi)容感知填充(高級(jí),Java 實(shí)現(xiàn)復(fù)雜)

類似于 Photoshop 的“內(nèi)容感知填充”功能。這需要非常復(fù)雜的算法,通常涉及機(jī)器學(xué)習(xí)/深度學(xué)習(xí)。在 Java 中,你可以集成預(yù)訓(xùn)練的深度學(xué)習(xí)模型(如 TensorFlow Java API 或 Deep Java Library (DJL))來(lái)實(shí)現(xiàn),但這屬于非常專業(yè)的領(lǐng)域,超出了普通開(kāi)發(fā)的范疇。

總結(jié)與建議

方法適用場(chǎng)景優(yōu)點(diǎn)缺點(diǎn)推薦度
?覆蓋/裁剪?純色背景或邊緣水印簡(jiǎn)單粗暴,速度快破壞原圖,適用場(chǎng)景有限★★☆☆☆
?顏色處理?水印與背景色差大相對(duì)簡(jiǎn)單復(fù)雜背景效果差,痕跡明顯★★☆☆☆
?OpenCV 修復(fù)??絕大多數(shù)復(fù)雜場(chǎng)景??效果最好,最智能?需要集成第三方庫(kù),制作掩膜較麻煩?★★★★★?
?深度學(xué)習(xí)?任何場(chǎng)景,要求極高效果潛力最佳極其復(fù)雜,需要大量資源和專業(yè)知識(shí)★☆☆☆☆

?給你的建議:??

  • ?首先分析水印?:它是位于純色背景上,還是復(fù)雜的圖片上?是半透明的嗎?
  • ?嘗試簡(jiǎn)單方法?:如果是純色背景,先用方法一或二試試。
  • ?首選 OpenCV?:對(duì)于絕大多數(shù)真實(shí)世界的圖片,?使用方法三(OpenCV 圖像修復(fù))是最可靠和專業(yè)的選擇。雖然需要配置環(huán)境,但效果遠(yuǎn)好于自己手寫的簡(jiǎn)單算法。
  • ?管理預(yù)期?:沒(méi)有任何算法能保證 100% 完美去除水印且不留任何痕跡,尤其是水印覆蓋在復(fù)雜紋理(如毛發(fā)、草地)上時(shí)。

到此這篇關(guān)于java去除圖片水印的四種方法實(shí)現(xiàn)與對(duì)比的文章就介紹到這了,更多相關(guān)java去除圖片水印內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Spring中@PathVariable注解的簡(jiǎn)單使用

    Spring中@PathVariable注解的簡(jiǎn)單使用

    這篇文章主要介紹了Spring中@PathVariable注解的簡(jiǎn)單使用,@PathVariable 是 Spring Framework 中的注解之一,用于處理 RESTful Web 服務(wù)中的 URL 路徑參數(shù),它的作用是將 URL 中的路徑變量綁定到方法的參數(shù)上,需要的朋友可以參考下
    2024-01-01
  • java自帶命令行工具jmap、jhat與jinfo的使用實(shí)例代碼詳解

    java自帶命令行工具jmap、jhat與jinfo的使用實(shí)例代碼詳解

    本篇文章主要通過(guò)代碼實(shí)例對(duì)java自帶命令行工具jmap、jhat與jinfo的使用做出了詳解,需要的朋友可以參考下
    2017-04-04
  • Spring Boot訪問(wèn)靜態(tài)資源css/js,你真的懂了嗎

    Spring Boot訪問(wèn)靜態(tài)資源css/js,你真的懂了嗎

    在搭建springboot時(shí)經(jīng)常需要在html中訪問(wèn)一些靜態(tài)資源,很多朋友不清楚如何在 Spring Boot中訪問(wèn)靜態(tài)資源,本文給大家?guī)?lái)兩種解決方案,感興趣的朋友跟隨小編一起看看吧
    2021-05-05
  • Java通俗易懂系列設(shè)計(jì)模式之責(zé)任鏈模式

    Java通俗易懂系列設(shè)計(jì)模式之責(zé)任鏈模式

    這篇文章主要介紹了Java通俗易懂系列設(shè)計(jì)模式之責(zé)任鏈模式,對(duì)設(shè)計(jì)模式感興趣的同學(xué),一定要看一下
    2021-04-04
  • Java后端對(duì)接微信支付(小程序、APP、PC端掃碼)包含查單退款

    Java后端對(duì)接微信支付(小程序、APP、PC端掃碼)包含查單退款

    微信支付我們主要聚焦于這三種支付方式,其中JSPAI與APP主要與uniapp開(kāi)發(fā)微信小程序與APP對(duì)接,本文主要介紹了Java后端對(duì)接微信支付(小程序、APP、PC端掃碼)包含查單退款,具有一定的參考價(jià)值,感興趣的可以了解一下
    2021-12-12
  • jpa實(shí)現(xiàn)只查詢指定的字段

    jpa實(shí)現(xiàn)只查詢指定的字段

    這篇文章主要介紹了jpa實(shí)現(xiàn)只查詢指定的字段,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • Java程序結(jié)構(gòu)與常量變量難點(diǎn)解析

    Java程序結(jié)構(gòu)與常量變量難點(diǎn)解析

    JAVA的基本結(jié)構(gòu)就是順序結(jié)構(gòu),除非特別指明,否則就按照順序一句一句執(zhí)行順序結(jié)構(gòu)是最簡(jiǎn)單的算法結(jié)構(gòu),語(yǔ)句與語(yǔ)句之間,框與框之間是按從上到下的順序進(jìn)行的,它是由若干個(gè)依次執(zhí)行的處理步驟組成的,它是任何一個(gè)算法都離不開(kāi)的一種基本算法結(jié)構(gòu)
    2021-10-10
  • Activiti開(kāi)發(fā)環(huán)境的配置

    Activiti開(kāi)發(fā)環(huán)境的配置

    本篇文章主要內(nèi)容介紹了Activiti開(kāi)發(fā)環(huán)境的配置,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-04-04
  • Java中利用BitMap位圖實(shí)現(xiàn)海量級(jí)數(shù)據(jù)去重

    Java中利用BitMap位圖實(shí)現(xiàn)海量級(jí)數(shù)據(jù)去重

    有許多方法可以用來(lái)去重,比如使用列表、集合等等,但這些方法通常只適用于一般情況,然而,當(dāng)涉及到大量數(shù)據(jù)去重時(shí),常見(jiàn)的 Java Set、List,甚至是 Java 8 的新特性 Stream 流等方式就顯得不太合適了,本文給大家介紹了Java中利用BitMap位圖實(shí)現(xiàn)海量級(jí)數(shù)據(jù)去重
    2024-04-04
  • Mybatis框架之工廠模式(Factory Pattern)

    Mybatis框架之工廠模式(Factory Pattern)

    MyBatis中使用工廠模式來(lái)管理和創(chuàng)建SqlSession對(duì)象,從而簡(jiǎn)化數(shù)據(jù)庫(kù)訪問(wèn)的配置和管理過(guò)程,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2024-11-11

最新評(píng)論

泉州市| 梅河口市| 房山区| 湘潭市| 申扎县| 镇巴县| 堆龙德庆县| 偏关县| 阜阳市| 博客| 大余县| 洪湖市| 沾益县| 峨山| 盐源县| 淅川县| 永顺县| 泰来县| 分宜县| 乌什县| 个旧市| 安庆市| 青铜峡市| 安新县| 河源市| 吉林省| 葫芦岛市| 二连浩特市| 祥云县| 巩义市| 盘锦市| 新安县| 芦山县| 姜堰市| 宁都县| 南平市| 郯城县| 元阳县| 佛坪县| 双流县| 泸溪县|