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

Java實(shí)現(xiàn)添加文字水印&圖片水印的方法詳解

 更新時(shí)間:2023年02月06日 15:32:56   作者:全村最野的狗  
為圖片添加水印的主要作用是保護(hù)圖片版權(quán),防止圖片被未經(jīng)授權(quán)的人使用或傳播。本文為大家介紹了Java實(shí)現(xiàn)添加文字水印&圖片水印的具體方法,需要的可以參考一下

為什么要給圖片添加水印

為圖片添加水印的主要作用是保護(hù)圖片版權(quán),防止圖片被未經(jīng)授權(quán)的人使用或傳播。

通常情況下,圖片水印會(huì)包含圖片作者的名字、版權(quán)信息或公司商標(biāo)等信息,這些信息可以幫助識(shí)別圖片的所有者,并對(duì)未經(jīng)授權(quán)的使用進(jìn)行追究。

此外,圖片水印還可以用于提醒人們圖片的使用限制,例如是否需要授權(quán)、是否可以用于商業(yè)用途等。

除此之外,圖片水印還可以用于增加圖片的視覺(jué)吸引力或宣傳性,例如可以在圖片中添加品牌 logo 或宣傳標(biāo)語(yǔ)等。

總的來(lái)說(shuō),圖片水印的主要作用是保護(hù)圖片版權(quán)和提醒人們圖片的使用限制,但也可以用于提升圖片的視覺(jué)效果和宣傳性。

繪制文字水印

為圖片添加水印是一種常用的圖片處理技術(shù)。在 Java 中可以使用 Graphics2D 類來(lái)繪制水印。

以下是一個(gè)簡(jiǎn)單的例子,展示了如何在圖片的右下角添加一個(gè)水?。?/p>

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;

public class Watermark {
    public static void main(String[] args) {
        // 讀取原圖片
        BufferedImage image = null;
        try {
            image = ImageIO.read(new File("original.jpg"));
        } catch (IOException e) {
            e.printStackTrace();
        }
        // 獲取圖片的寬度和高度
        int width = image.getWidth();
        int height = image.getHeight();
        // 創(chuàng)建一個(gè)圖片緩存對(duì)象
        BufferedImage newImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
        // 獲取圖片的畫(huà)筆
        Graphics2D g = newImage.createGraphics();
        // 將原圖片繪制到緩存圖片上
        g.drawImage(image, 0, 0, width, height, null);
        // 設(shè)置水印的字體樣式
        g.setFont(new Font("微軟雅黑", Font.BOLD, 20));
        // 設(shè)置水印的顏色
        g.setColor(Color.red);
        // 設(shè)置水印的位置
        g.drawString("Hello World!", width - 120, height - 10);
        // 釋放圖形上下文使用的系統(tǒng)資源
        g.dispose();
        // 保存帶水印的圖片
        try {
            ImageIO.write(newImage, "jpg", new File("watermarked.jpg"));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

動(dòng)態(tài)計(jì)算字符串的寬度

如果你已經(jīng)知道了字符串的大小(size)和內(nèi)容(str),想要計(jì)算字符串的寬度,可以使用以下方法:

首先創(chuàng)建一個(gè) Font 對(duì)象,使用該對(duì)象的 getStringBounds 方法計(jì)算字符串的寬度。

import java.awt.Font;
import java.awt.font.FontRenderContext;
import java.awt.geom.Rectangle2D;

public class StringWidth {
    public static void main(String[] args) {
        // 字符串內(nèi)容
        String str = "Hello World!";
        // 字體大小
        int size = 20;
        // 創(chuàng)建字體對(duì)象
        Font font = new Font("微軟雅黑", Font.BOLD, size);
        // 創(chuàng)建字體渲染上下文
        FontRenderContext frc = new FontRenderContext(null, true, true);
        // 計(jì)算字符串的寬度
        Rectangle2D bounds = font.getStringBounds(str, frc);
        // 輸出字符串的寬度
        System.out.println(bounds.getWidth());
    }
}

在這段代碼中,我們首先創(chuàng)建了一個(gè) Font 對(duì)象,然后使用該對(duì)象的 getStringBounds 方法計(jì)算字符串的寬度。

注意,在調(diào)用 getStringBounds 方法時(shí),需要傳入一個(gè) FontRenderContext 對(duì)象,該對(duì)象用于描述字體的渲染環(huán)境,可以影響字符串的顯示效果。

最后,計(jì)算出的字符串寬度是一個(gè) Rectangle2D 對(duì)象,你可以使用 getWidth 方法來(lái)獲取實(shí)際的寬度值。

自適應(yīng)文字水印位置

可以看到,我們添加的水印已經(jīng)超出了圖片的范圍,導(dǎo)致顯示不完全,出現(xiàn)這種結(jié)果的原因是因?yàn)槲覀兡J(rèn)字符的寬度為120px.您可以通過(guò)上面介紹的動(dòng)態(tài)計(jì)算字符寬度來(lái)讓水印始終顯示在圖片上。

import java.awt.Color;
import java.awt.font.FontRenderContext;
import java.awt.geom.Rectangle2D;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;

public class Watermark {
    public static void main(String[] args) {
        // 讀取原圖片
        BufferedImage image = null;
        try {
            image = ImageIO.read(new File("original.jpg"));
        } catch (IOException e) {
            e.printStackTrace();
        }
        // 獲取圖片的寬度和高度
        int width = image.getWidth();
        int height = image.getHeight();
        // 創(chuàng)建一個(gè)圖片緩存對(duì)象
        BufferedImage newImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
        // 獲取圖片的畫(huà)筆
        Graphics2D g = newImage.createGraphics();
        // 字符串內(nèi)容
        String str = "Hello World!";
        // 字體大小
        int size = 20;
        // 創(chuàng)建字體對(duì)象
        Font font = new Font("微軟雅黑", Font.BOLD, size);
        // 創(chuàng)建字體渲染上下文
        FontRenderContext frc = new FontRenderContext(null, true, true);
        // 計(jì)算字符串的寬度和高度
        Rectangle2D bounds = font.getStringBounds(str, frc);
        // 字符寬度
        int strWidth = (int)bounds.getWidth();
        // 字符高度
        int strHeight = (int)bounds.getHeight();
        // 將原圖片繪制到緩存圖片上
        g.drawImage(image, 0, 0, width, height, null);
        // 設(shè)置水印的字體樣式
        g.setFont(font);
        // 設(shè)置水印的顏色
        g.setColor(Color.red);
        // 設(shè)置水印的位置
        g.drawString("Hello World!", width - strWidth - 10, height - strHeight - 10);
        // 釋放圖形上下文使用的系統(tǒng)資源
        g.dispose();
        // 保存帶水印的圖片
        try {
            ImageIO.write(newImage, "jpg", new File("watermarked.jpg"));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

繪制圖片水印

如果你想在 png 格式的圖片上繪制透明的圖片水印,可以使用以下方法:

首先讀取原圖片和水印圖片,然后使用 Graphics2D 類的 drawImage 方法將水印圖片繪制到原圖片上,最后使用 setComposite 方法設(shè)置水印圖片的 alpha 通道值來(lái)調(diào)整水印的透明度。

紫色部分為圖片水印。

具體實(shí)現(xiàn)如下:

import java.awt.AlphaComposite;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;

public class TransparentWatermark {
    public static void main(String[] args) {
        // 讀取原圖片
        BufferedImage image = null;
        try {
            image = ImageIO.read(new File("original.png"));
        } catch (IOException e) {
            e.printStackTrace();
        }
        // 獲取圖片的寬度和高度
        int width = image.getWidth();
        int height = image.getHeight();
        // 創(chuàng)建一個(gè)圖片緩存對(duì)象
        BufferedImage newImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
        // 獲取圖片的畫(huà)筆
        Graphics2D g = newImage.createGraphics();
        // 將原圖片繪制到緩存圖片上
        g.drawImage(image, 0, 0, width, height, null);
        // 讀取水印圖片
        BufferedImage watermark = null;
        try {
            watermark = ImageIO.read(new File("watermark.png"));
        } catch (IOException e) {
            e.printStackTrace();
        }
        // 獲取水印圖片的寬度和高度
        int wmWidth = watermark.getWidth();
        int wmHeight = watermark.getHeight();
        // 設(shè)置水印圖片的透明度
        g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, 0.5f));
        // 繪制水印圖片
        g.drawImage(watermark, width - wmWidth - 10, height - wmHeight - 10, wmWidth, wmHeight, null);
        // 釋放圖形上下文使用的系統(tǒng)資源
        g.dispose();
        // 保存帶水印的圖片
        try {
            ImageIO.write(newImage, "png", new File("watermarked.png"));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

提升圖片處理速度

目前我們添加文字水印和圖片水印耗時(shí)都在 700ms - 2000ms

可以考慮以下幾種方法來(lái)提升速度:

  • 使用多線程:如果你需要批量添加文字水印,可以考慮使用多線程的方式來(lái)加速處理速度。例如,你可以將圖片分成多份,每份使用一個(gè)線程處理,最后再將結(jié)果合并。
  • 使用更快的圖片處理庫(kù):如果你使用的是 Java 原生的圖片處理工具(例如 java.awt 包),可以考慮使用更快的圖片處理庫(kù),例如 OpenCV、Imaging、Thumbnails 等。這些庫(kù)通常具有更快的處理速度,并且支持更多的圖片格式和操作。
  • 減少圖片的質(zhì)量:如果你的圖片尺寸較大,可以考慮將圖片的質(zhì)量壓縮到一個(gè)較低的水平,這樣可以減少圖片的體積,從而加快處理速度。
  • 優(yōu)化代碼:如果你的代碼有一些低效的地方,可以考慮優(yōu)化代碼,提升程序的執(zhí)行效率。例如,可以避免使用過(guò)多的循環(huán)和分支語(yǔ)句,或者使用更快的算法等。

到此這篇關(guān)于Java實(shí)現(xiàn)添加文字水印&圖片水印的方法詳解的文章就介紹到這了,更多相關(guān)Java添加水印內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 一文詳解spring注解配置bean的初始化方法和銷毀方法

    一文詳解spring注解配置bean的初始化方法和銷毀方法

    本篇我們講解下spring項(xiàng)目中如何為bean指定初始化方法和銷毀方法。當(dāng)spring完成bean的屬性賦值之后,就會(huì)執(zhí)行bean的初始化方法,而當(dāng)spring要銷毀bean實(shí)例的時(shí)候,也會(huì)調(diào)用bean的銷毀方法。文中有詳細(xì)的代碼實(shí)例,需要的朋友可以參考下
    2023-05-05
  • JavaWeb 網(wǎng)上書(shū)店 注冊(cè)和登陸功能案例詳解

    JavaWeb 網(wǎng)上書(shū)店 注冊(cè)和登陸功能案例詳解

    這篇文章主要介紹了JavaWeb 網(wǎng)上書(shū)店 注冊(cè)和登陸功能,結(jié)合具體案例形式詳細(xì)分析了JavaWeb 網(wǎng)上書(shū)店 注冊(cè)和登陸功能具體實(shí)現(xiàn)步驟、操作技巧與注意事項(xiàng),需要的朋友可以參考下
    2019-08-08
  • Java Swing仿QQ登錄界面效果

    Java Swing仿QQ登錄界面效果

    這篇文章主要為大家詳細(xì)介紹了Java Swing仿QQ登錄界面效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-05-05
  • 解決新版idea新建文件沒(méi)有XML和Resource Bundle文件問(wèn)題

    解決新版idea新建文件沒(méi)有XML和Resource Bundle文件問(wèn)題

    這篇文章主要介紹了解決新版idea新建文件沒(méi)有XML和Resource Bundle文件問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-07-07
  • java構(gòu)建Stream流的多種方式總結(jié)

    java構(gòu)建Stream流的多種方式總結(jié)

    Java?8引入了Stream流作為一項(xiàng)新的特性,它是用來(lái)處理集合數(shù)據(jù)的一種函數(shù)式編程方式,本文為大家整理了多種java構(gòu)建Stream流的方式,希望對(duì)大家有所幫助
    2023-11-11
  • Java中的static關(guān)鍵字全面解析

    Java中的static關(guān)鍵字全面解析

    這篇文章主要介紹了Java中的static關(guān)鍵字全面解析的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2016-06-06
  • java反射方式創(chuàng)建代碼詳解

    java反射方式創(chuàng)建代碼詳解

    在本篇文章里小編給大家整理的是一篇關(guān)于java反射方式創(chuàng)建代碼詳解內(nèi)容,對(duì)此有興趣的朋友們可以學(xué)習(xí)下。
    2021-01-01
  • springboot中通過(guò)lua腳本來(lái)獲取序列號(hào)的方法

    springboot中通過(guò)lua腳本來(lái)獲取序列號(hào)的方法

    這篇文章主要介紹了springboot中通過(guò)lua腳本來(lái)獲取序列號(hào)的方法,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-06-06
  • Maven倉(cāng)庫(kù)的具體使用(本地倉(cāng)庫(kù)+遠(yuǎn)程倉(cāng)庫(kù))

    Maven倉(cāng)庫(kù)的具體使用(本地倉(cāng)庫(kù)+遠(yuǎn)程倉(cāng)庫(kù))

    Maven 在某個(gè)統(tǒng)一的位置存儲(chǔ)所有項(xiàng)目的構(gòu)件,這個(gè)統(tǒng)一的位置,我們就稱之為倉(cāng)庫(kù),本文主要介紹了Maven倉(cāng)庫(kù)的具體使用(本地倉(cāng)庫(kù)+遠(yuǎn)程倉(cāng)庫(kù)),感興趣的可以了解一下
    2023-11-11
  • Spring?Cloud?整合?nacos實(shí)現(xiàn)動(dòng)態(tài)配置中心的詳細(xì)步驟

    Spring?Cloud?整合?nacos實(shí)現(xiàn)動(dòng)態(tài)配置中心的詳細(xì)步驟

    這篇文章主要介紹了Spring?Cloud?整合?nacos?實(shí)現(xiàn)動(dòng)態(tài)配置中心,整合步驟是通過(guò)添加依賴新建nacos配置,本文分步驟通過(guò)實(shí)例代碼給大家詳細(xì)講解,需要的朋友可以參考下
    2022-10-10

最新評(píng)論

顺平县| 南汇区| 青海省| 木兰县| 穆棱市| 织金县| 罗平县| 洱源县| 通许县| 林甸县| 东阿县| 额尔古纳市| 咸宁市| 右玉县| 保靖县| 张北县| 石家庄市| 雷山县| 光泽县| 定州市| 花垣县| 隆安县| 喀喇| 班戈县| 永济市| 文昌市| 阿克苏市| 临江市| 淳化县| 文化| 阿巴嘎旗| 巴林右旗| 浙江省| 康马县| 建宁县| 徐水县| 益阳市| 乐陵市| 无为县| 桦南县| 思南县|