Windows和Linux服务器给图片添加水印两种方法,引用字体库和自带字体库

news/2024/10/25 12:20:32/

文章目录

    • 一、效果展示
    • 二、前提说明
    • 三、Windows自带字体库实现方法
    • 四、引入字体库实现方法

一、效果展示

水印123如下图

1.可以自定义(类型:汉字、数字都支持)
2.可以定位指定位置
在这里插入图片描述

二、前提说明

  1. 实现添加水印功能中Windows服务器和Linux服务器的区别是:Windows自带字体库,而Linux不带,如果是数字类型水印,区别不大,汉字的话,Windows正常显示,Linux显示口口口这样的
  2. Windows的字体库资源不需要网上下载,找到C:\Windows\Fonts目录下,选择想用的字体资源即可,字体资源后缀是.ttc文件,与Linux服务器通用
  3. 下面有两种实现方法:1自带字体库(Windows),2引入字体库,区别是Font的生成方式不同
  4. 字体库的引入可以放到项目里面,也可以放到服务器指定文件夹
  5. 文件只能是图片才能加水印
  6. 颜色推荐使用Color.GRAY

三、Windows自带字体库实现方法

package com.joolun.cloud.common.core.util;import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.InputStream;
import javax.imageio.ImageIO;public class WaterMarkUtils {/*** 图片添加水印** @param imgFile*            需要添加水印的图片* @param markContentColor*            水印文字的颜色* @param waterMarkContent*            水印的文字* @return  水印图片*/public static File markStr(File imgFile, Color markContentColor, String waterMarkContent) {try {// 加水印BufferedImage bufImg = ImageIO.read(imgFile);int width = bufImg.getWidth(); //图片宽int height = bufImg.getHeight(); //图片高Graphics2D g = bufImg.createGraphics();g.drawImage(bufImg, 0, 0, width, height, null);Font font = new Font("微软雅黑", Font.ITALIC, 45);g.setColor(markContentColor); // 根据图片的背景设置水印颜色g.setFont(font);int x = width -2*getWatermarkLength(waterMarkContent, g); //这是一个计算水印位置的函数,可以根据需求添加int y = height - 1*getWatermarkLength(waterMarkContent, g);System.out.println("水印位置x="+x);System.out.println("水印位置y="+y);g.drawString(waterMarkContent, x, y);g.dispose();ImageIO.write(bufImg, "png", imgFile);return imgFile;} catch (Exception e) {e.printStackTrace();}return null;}/*** 获取水印文字总长度** @param waterMarkContent*            水印的文字* @param g* @return 水印文字总长度*/public static int getWatermarkLength(String waterMarkContent, Graphics2D g) {return g.getFontMetrics(g.getFont()).charsWidth(waterMarkContent.toCharArray(), 0, waterMarkContent.length());}
}

四、引入字体库实现方法

package com.joolun.cloud.common.core.util;import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.InputStream;
import javax.imageio.ImageIO;public class WaterMarkUtils {/*** 图片添加水印** @param imgFile*            需要添加水印的图片* @param markContentColor*            水印文字的颜色* @param waterMarkContent*            水印的文字* @return  水印图片*/public static File markStr(File imgFile, Color markContentColor, String waterMarkContent) {try {// 加水印BufferedImage bufImg = ImageIO.read(imgFile);int width = bufImg.getWidth(); //图片宽int height = bufImg.getHeight(); //图片高Graphics2D g = bufImg.createGraphics();g.drawImage(bufImg, 0, 0, width, height, null);try (//这个/fonts/simsun.ttc可以是在项目中,也可以是在服务器指定文件中InputStream fontFile = WaterMarkUtils.class.getResourceAsStream("/fonts/simsun.ttc")) {Font font = Font.createFont(Font.PLAIN, fontFile).deriveFont(Font.BOLD, 10f);g.setColor(markContentColor); // 根据图片的背景设置水印颜色g.setFont(font);}int x = width -2*getWatermarkLength(waterMarkContent, g); //这是一个计算水印位置的函数,可以根据需求添加int y = height - 1*getWatermarkLength(waterMarkContent, g);System.out.println("水印位置x="+x);System.out.println("水印位置y="+y);g.drawString(waterMarkContent, x, y);g.dispose();ImageIO.write(bufImg, "png", imgFile);return imgFile;} catch (Exception e) {e.printStackTrace();}return null;}/*** 获取水印文字总长度** @param waterMarkContent*            水印的文字* @param g* @return 水印文字总长度*/public static int getWatermarkLength(String waterMarkContent, Graphics2D g) {return g.getFontMetrics(g.getFont()).charsWidth(waterMarkContent.toCharArray(), 0, waterMarkContent.length());}
}

http://www.ppmy.cn/news/117893.html

相关文章

springBoot-MyBatis-Plus-binlog日志监听BinaryLogClient

前言 :项目中如果想要实时监听Mysql 表中数据的实时状态(插入,更新,删除),并根据不同的状态做出相应的动作,应该怎么办; 1 BinaryLogClient 介绍: BinaryLogClient是一…

项目管理:面对未知的挑战时,如何获取和使用信息?

一项实验展示了人们在面对未知的挑战时,对信息的获取和使用的影响。在下面的实验中,三组人被要求步行到十公里外的三个村庄。 第一组人没有任何信息,只跟着向导走。他们在走了短短的两三公里后就开始抱怨和情绪低落,同时感到疲惫…

stg游戏c语言,坦克大战改版

《坦克大战改》是一款国内玩家模仿FC经典游戏坦克大战所自制的小游戏,游戏中玩家将会控制坦克保卫基地,一旦基地失守关卡就会失败。游戏支持手柄震动 ,同时包含有关卡编辑器,让玩家能够自由编辑关卡。 游戏信息 游戏名称&#xff…

c语言编程简单小游戏坦克大战,坦克大战1990(c语言文件版)游戏

坦克大战1990(c语言文件版)是一款很炫的坦克战争类游戏。游戏设计感很强。敌人千变万化,但是你可别被迷惑哦,将他们通通歼灭吧! 作者的话 经过四五天的奋斗,第一次编的游戏终于完成了,好激动。 首先得感谢一下吧友&…

Python文章合集 | (入门到实战、游戏、Turtle、案例等)

🌹前言 为了大家能相应的找到自己喜欢哪方面的文章,这边小编进行了文章的汇总合集,也特别感谢我的 粉丝们!我会加油滴~文末公众号可见免费资料哈! 👍正文 每日更新: 项目0.1 30个精心整理的…

Python—2023 |已有文章汇总 | 持续更新,直接看这篇就够了

🎁导语 现将之前写过的文章进行分类整理,方便大家观看找到自己喜欢的文章类型哦~ 所有文章源码素材都在文末公众hao自取哈!👇👇👇👇👇👇 💖每日更新&#xf…

编写外挂完全攻略

一、先说一下写一个外挂需要什么条件 1、熟练的C语言知识 目前的外挂大部分都是用BC或者是vc写的,拥有熟练的C语言知识是写外挂的基本条件 2、具有很强的汇编基础 一般游戏都不可能有原代码的,必须*反汇编或者跟踪的办 法来探索其中的机理 &#xff0…

ioGame 网络游戏服务器框架 (java)、java游戏服务器、netty 集群分步式的网络游戏服务器

ioGame 无锁异步化、事件驱动的架构设计;轻量级,无需依赖任何第三方中间件或数据库就能支持集群、分布式 通过 ioGame 可以很容易的搭建出一个集群无中心节点、集群自动化、多进程的分步式游戏服务器 包体小、启动快、内存占用少、更加的节约、无需配…