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

教你怎么用Java實(shí)現(xiàn)給圖片打上水印

 更新時(shí)間:2021年04月30日 15:02:09   作者:牙刷冰冰  
這篇文章主要介紹了教你怎么用Java實(shí)現(xiàn)給圖片打上水印,文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)java的小伙伴們有非常好的幫助,需要的朋友可以參考下

一、原圖片

在這里插入圖片描述

二、打水印(文字)

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;

public class ImageUtils {

    // 水印字體
    private static final Font FONT = new Font("微軟雅黑", Font.PLAIN, 14);

    // 透明度
    private static final AlphaComposite COMPOSITE = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.6f);

    // 水印之間的間隔
    private static final int XMOVE = 150;

    // 水印之間的間隔
    private static final int YMOVE = 200;
    
    /**
     * 打水印(文字)
     *
     * @param srcImgPath       源文件地址
     * @param font             字體
     * @param markContentColor 水印顏色
     * @param waterMarkContent 水印內(nèi)容
     */
    public static void markWithContent(String srcImgPath, Font font, Color markContentColor, String waterMarkContent) {
        FileOutputStream fos = null;
        try {
            // 讀取原圖片信息
            File srcFile = new File(srcImgPath);
            BufferedImage srcImg = ImageIO.read(srcFile);

            // 圖片寬、高
            int imgWidth = srcImg.getWidth();
            int imgHeight = srcImg.getHeight();

            // 圖片緩存
            BufferedImage bufImg = new BufferedImage(imgWidth, imgHeight, BufferedImage.TYPE_INT_RGB);

            // 創(chuàng)建繪圖工具
            Graphics2D g = bufImg.createGraphics();

            // 畫入原始圖像
            g.drawImage(srcImg, 0, 0, imgWidth, imgHeight, null);

            // 設(shè)置水印顏色
            g.setColor(markContentColor);

            // 設(shè)置水印透明度
            g.setComposite(COMPOSITE);

            // 設(shè)置傾斜角度
            g.rotate(Math.toRadians(-35), (double) bufImg.getWidth() / 2, (double) bufImg.getHeight() / 2);

            // 設(shè)置水印字體
            g.setFont(font);

            // 消除java.awt.Font字體的鋸齒
            g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);

            int x = -imgWidth / 2;
            int y;

            // 字體長(zhǎng)度
            int markWidth = FONT.getSize() * getTextLength(waterMarkContent);
            // 字體高度
            int markHeight = FONT.getSize();

            // 循環(huán)添加水印
            while (x < imgWidth * 1.5) {
                y = -imgHeight / 2;
                while (y < imgHeight * 1.5) {
                    g.drawString(waterMarkContent, x, y);
                    y += markHeight + YMOVE;
                }
                x += markWidth + XMOVE;
            }

            // 釋放畫圖工具
            g.dispose();

            // 輸出圖片
            fos = new FileOutputStream(srcFile);
            ImageIO.write(bufImg, "jpg", fos);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (fos != null) {
                try {
                    fos.flush();
                    fos.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    }


    //計(jì)算水印文本長(zhǎng)度
    //1、中文長(zhǎng)度即文本長(zhǎng)度 2、英文長(zhǎng)度為文本長(zhǎng)度二分之一
    public static int getTextLength(String text) {
        //水印文字長(zhǎng)度
        int length = text.length();

        for (int i = 0; i < text.length(); i++) {
            String s = String.valueOf(text.charAt(i));
            if (s.getBytes().length > 1) {
                length++;
            }
        }
        length = length % 2 == 0 ? length / 2 : length / 2 + 1;
        return length;
    }
    
    
    public static void main(String[] args) {
        ImageUtils.markWithContent("C:\\Users\\lbb\\Pictures\\test.jpg", FONT, Color.darkGray, "水印文字");
    }
}

打了水印后的效果

在這里插入圖片描述

三、打水印(圖片)

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;

public class ImageUtils {

    // 透明度
    private static final AlphaComposite COMPOSITE = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.6f);

    // 水印之間的間隔
    private static final int XMOVE = 150;

    // 水印之間的間隔
    private static final int YMOVE = 200;

    /**
     * 打水印(圖片)
     *
     * @param srcImgPath  源圖片路徑
     * @param markImgPath 水印圖片路徑
     */
    public static void markWithImg(String srcImgPath, String markImgPath) {
        FileOutputStream fos = null;

        try {
            // 讀取原始圖像
            File srcFile = new File(srcImgPath);
            BufferedImage srcImg = ImageIO.read(srcFile);

            // 原始寬度
            int srcImgWidth = srcImg.getWidth();
            // 原始高度
            int srcImgHeight = srcImg.getHeight();

            // 最終圖像
            BufferedImage bufImg = new BufferedImage(srcImgWidth, srcImgHeight, BufferedImage.TYPE_INT_RGB);

            // 創(chuàng)建繪圖工具
            Graphics2D g = bufImg.createGraphics();

            // 畫入原始圖像
            g.drawImage(srcImg, 0, 0, srcImgWidth, srcImgHeight, null);

            // 讀取水印圖片
            BufferedImage markImg = ImageIO.read(new File(markImgPath));

            // 圖片寬、高
            int markImgWidth = markImg.getWidth();
            int markImgHeight = markImg.getHeight();

            // 設(shè)置水印透明度
            g.setComposite(COMPOSITE);

            // 設(shè)置傾斜角度
            g.rotate(Math.toRadians(-35), (double) bufImg.getWidth() / 2, (double) bufImg.getHeight() / 2);

            // 循環(huán)添加水印
            int x = -srcImgWidth / 2;
            int y;
            while (x < srcImgWidth * 1.5) {
                y = -srcImgHeight / 2;
                while (y < srcImgHeight * 1.5) {
                    g.drawImage(markImg, x, y, null);
                    y += markImgHeight + YMOVE;
                }
                x += markImgWidth + XMOVE;
            }

            // 釋放畫圖工具
            g.dispose();

            // 輸出圖片
            fos = new FileOutputStream(srcFile);
            ImageIO.write(bufImg, "jpg", fos);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (fos != null) {
                try {
                    fos.flush();
                    fos.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    }
    

    public static void main(String[] args) {
        ImageUtils.markWithImg("C:\\Users\\lbb\\Pictures\\test.jpg", "C:\\Users\\lbb\\Pictures\\mark.png");
    }
}

下面是水印圖片

在這里插入圖片描述

下面是打了水印后的效果

在這里插入圖片描述

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

相關(guān)文章

  • 你知道怎么用Spring的三級(jí)緩存解決循環(huán)依賴嗎

    你知道怎么用Spring的三級(jí)緩存解決循環(huán)依賴嗎

    這篇文章主要為大家詳細(xì)介紹了Spring的三級(jí)緩存解決循環(huán)依賴,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-02-02
  • Java中從Integer到Date的轉(zhuǎn)換方法

    Java中從Integer到Date的轉(zhuǎn)換方法

    這篇文章主要介紹了Java中integer怎么轉(zhuǎn)換date,在Java中,如果我們有一個(gè)Integer類型的數(shù)據(jù),想要將其轉(zhuǎn)換為Date類型,本文給大家介紹了實(shí)現(xiàn)方法,并通過代碼示例講解的非常詳細(xì),需要的朋友可以參考下
    2024-05-05
  • Netty結(jié)合Protobuf進(jìn)行編解碼的方法

    Netty結(jié)合Protobuf進(jìn)行編解碼的方法

    這篇文章主要介紹了Netty結(jié)合Protobuf進(jìn)行編解碼,通過文檔表述和代碼實(shí)例充分說明了如何進(jìn)行使用和操作,需要的朋友可以參考下
    2021-06-06
  • springcloud?如何解決微服務(wù)之間token傳遞問題

    springcloud?如何解決微服務(wù)之間token傳遞問題

    這篇文章主要介紹了springcloud?如何解決微服務(wù)之間token傳遞問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • SpringBoot如何在線程中獲取@Service Bean類

    SpringBoot如何在線程中獲取@Service Bean類

    這篇文章主要介紹了SpringBoot如何在線程中獲取@Service Bean類,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • 深度剖析Java中的內(nèi)存原型及工作原理

    深度剖析Java中的內(nèi)存原型及工作原理

    這篇文章主要介紹了深度剖析Java中的內(nèi)存原型及工作原理,本文講解了java虛擬機(jī)內(nèi)存原型、常量池、Java內(nèi)存分配中的棧、Java內(nèi)存分配中的堆等內(nèi)容,需要的朋友可以參考下
    2015-01-01
  • Java中線程Thread的三種方式和對(duì)比

    Java中線程Thread的三種方式和對(duì)比

    這篇文章主要介紹了Java中線程Thread的三種方式和對(duì)比,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • 如何使用bootstrap.yml讀取配置中心的配置文件

    如何使用bootstrap.yml讀取配置中心的配置文件

    這篇文章主要介紹了如何使用bootstrap.yml讀取配置中心的配置文件問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-07-07
  • 原來Java接口多實(shí)現(xiàn)還可以這樣玩

    原來Java接口多實(shí)現(xiàn)還可以這樣玩

    JAVA中類不直接支持多繼承,因?yàn)闀?huì)出現(xiàn)調(diào)用的不確定性,所以JAVA將多繼承機(jī)制進(jìn)行改良,在JAVA中變成了多實(shí)現(xiàn),這篇文章主要給大家介紹了關(guān)于Java接口多實(shí)現(xiàn)的相關(guān)資料,需要的朋友可以參考下
    2021-09-09
  • java 中Thread.join()的使用方法

    java 中Thread.join()的使用方法

    這篇文章主要介紹了java 中Thread.join()的使用方法的相關(guān)資料,需要的朋友可以參考下
    2017-04-04

最新評(píng)論

襄汾县| 思南县| 壤塘县| 宁河县| 芦溪县| 新昌县| 新昌县| 陇川县| 睢宁县| 巴彦县| 白银市| 双桥区| 建湖县| 得荣县| 富川| 雅江县| 阿克陶县| 南汇区| 辽宁省| 鞍山市| 绥棱县| 桦南县| 东明县| 堆龙德庆县| 怀化市| 南澳县| 开原市| 涿鹿县| 略阳县| 甘肃省| 日照市| 武夷山市| 玉溪市| 彭阳县| 耒阳市| 横峰县| 邮箱| 阳江市| 长岛县| 嘉义市| 海南省|