/**
* 图片天加文字水印(默认缩小scale)
* 备注:
* Positions.BOTTOM_RIGHT 表示水印位置
*
* @param filePath 原图路径
* @param newFilePath 处理后新图片路径
* @param markText 水印文字
* @param scale 比例(0.1- 1.0)
* @param transparency 水印透明度
* @param type 1 按比例 2按宽高
* @param widthSize 缩放宽
* @param heightSize 缩放高
*/
public static boolean waterMarkWithText(String filePath, String newFilePath,
String markText, float scale, float transparency,
int widthSize, int heightSize, int type) {
try {
//先进行图片缩放
if (type == 1) {
imgScale(scale, filePath,newFilePath);
} else {
imgSize(widthSize,heightSize, filePath,newFilePath);
}
//获取缩放图分辨率
File file = new File(newFilePath);
BufferedImage imgBi = null;
try {
imgBi = ImageIO.read(file);
} catch (Exception e) {
e.printStackTrace();
}
//图片原始宽度
int width = imgBi.getWidth();
//图片原始高度
int height = imgBi.getHeight();
//计算右下角水印高宽
int waterWidth = new Double(width *0.5).intValue();
int waterHeight = new Double(height).intValue();
ImgHandle im = new ImgHandle();
String randomNum = String.valueOf(System.currentTimeMillis());
BufferedImage bi = im.apply(imgBi, waterWidth, waterHeight, markText, 1, randomNum);
BufferedImage bi2 = im.apply(imgBi, waterWidth, waterHeight, randomNum, 1, markText);
Watermark watermark = new Watermark(Positions.BOTTOM_LEFT,
bi, transparency);
Watermark watermark2 = new Watermark(Positions.BOTTOM_RIGHT,
bi2, transparency); Thumbnails.of(newFilePath).scale(1).
watermark(watermark).toFile(newFilePath);
watermark2(watermark2, newFilePath);
return true;
} catch (IOException e) {
e.printStackTrace();
return false;
}
}
/**
* 生成的水印
*
* @param img
* @return
*/
public BufferedImage apply(BufferedImage img, int waterWidth, int waterHeight, String markText, float scale,
String markText2) {
int width = img.getWidth();
int height = img.getHeight(); BufferedImage imgWithWatermark = new BufferedImage(waterWidth, waterHeight, BufferedImage.TYPE_INT_RGB);
Graphics2D g = imgWithWatermark.createGraphics(); //设置透明 start
imgWithWatermark = g.getDeviceConfiguration().createCompatibleImage(waterWidth, waterHeight, Transparency.TRANSLUCENT);
g = imgWithWatermark.createGraphics();
g.setColor(new Color(159, 160, 160));
//设置透明 end
int[] sizes = new int[]{60, 30, 20, 16, 14, 9, 8, 6, 4};
int contentLength = 0;
Font font = null;
for (int i = 0; i < 8; i++) {
//设置字体及大小
font = new Font("Helvetica Regular", Font.BOLD, sizes[i]);
g.setFont(font);
g.drawRect(0, 0, 0, 0);
contentLength = getWatermarkLength(markText + markText2, g);
if (contentLength < width) {
//找到最合适的字体
break;
}
}
//设置水印的坐标
FontDesignMetrics metrics = FontDesignMetrics.getMetrics(g.getFont());
int fontHeight = metrics.getHeight();
int y = waterHeight - fontHeight;
char[] data = markText.toCharArray();
if (markText.contains("https")) {
g.drawChars(data, 0, data.length, 4, y);
} else {
//这里的x1值需要根据你缩放后图片大小进行计算;
int x1 = 0;
if (width > 300) {
x1 = 270;
} else {
x1 = 55;
}
g.drawChars(data, 0, data.length, x1, y);
}
return imgWithWatermark;
}
//添加水印
public static boolean watermark2(Watermark watermark2, String filePath) {
try {
Thumbnails.of(filePath).scale(1).
watermark(watermark2).toFile(filePath);
return true;
} catch (IOException e) {
e.printStackTrace();
return false;
}
}
 /**
* 计算水印文字宽度
*
* @param waterMarkContent
* @param g
* @return
*/
public static int getWatermarkLength(String waterMarkContent, Graphics2D g) {
return g.getFontMetrics(g.getFont()).charsWidth(waterMarkContent.toCharArray(), 0, waterMarkContent.length());
}
/**
* 比例缩放
*
* @param scale
* @param filePath
* @param newFilePath
* @return
*/
public static boolean imgScale(float scale, String filePath, String newFilePath) {
try {
Thumbnails.of(filePath).scale(scale).toFile(newFilePath);
return true;
} catch (IOException e) {
e.printStackTrace();
return false;
}
} /**
* 大小缩放
* @param width
* @param height
* @param filePath
* @param newFilePath
* @return
*/
public static boolean imgSize(int width,int height, String filePath, String newFilePath) {
try {
Thumbnails.of(filePath).size(width,height).toFile(newFilePath);
return true;
} catch (IOException e) {
e.printStackTrace();
return false;
}
}
 public static void main(String[] args) {
String filePath = "C:\\Users\\admin\\Desktop\\1000.jpg";
String newFilePath = "C:\\Users\\admin\\Desktop\\800x800_2.jpg";
boolean sc2 = waterMarkWithText(filePath, newFilePath, "https://licd.beijing2022.cn", 1f, 1.0f, 1000, 1000, 1); }

等比缩放之后水印位置保持不变- -

java添加水印等比缩放的更多相关文章

  1. java图片高质量缩放类

    import java.awt.Color;import java.awt.Graphics;import java.awt.Image;import java.awt.image.BufferedI ...

  2. java处理图片--图片的缩放,旋转和马赛克化

    这是我自己结合网上的一些资料封装的java图片处理类,支持图片的缩放,旋转,马赛克化.(转载请注明出处:http://blog.csdn.net/u012116457) 不多说,上代码: packag ...

  3. java基础---->Java中图片的缩放

    缩略图代表网页上或计算机中图片经压缩方式处理后的小图 ,其中通常会包含指向完整大小的图片的超链接.缩略图用于在 Web 浏览器中更加迅速地装入图形或图片较多的网页.今天,我们就开始java中图像的缩略 ...

  4. java.awt.Graphics2D 图片缩放

    关键字:java image  thumbnail  google 粗略demo: import java.awt.Graphics2D; import java.awt.GraphicsConfig ...

  5. android图片缩放平移

    <?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android=" ...

  6. Nginx 独立图片服务器的搭建

    为什么需要独立图片服务器? 如果你留心的话,可以发现,现在主流的网站都是有单独的图片服务器的,例如,人人网的为rrimg,淘宝的为taobaocdn,下面还有很多的二级域名. 独立的图片服务器有诸多好 ...

  7. javaCV开发详解之4:转流器实现(也可作为本地收流器、推流器,新增添加图片及文字水印,视频图像帧保存),实现rtsp/rtmp/本地文件转发到rtmp流媒体服务器(基于javaCV-FFMPEG)

    javaCV系列文章: javacv开发详解之1:调用本机摄像头视频 javaCV开发详解之2:推流器实现,推本地摄像头视频到流媒体服务器以及摄像头录制视频功能实现(基于javaCV-FFMPEG.j ...

  8. Android WebKit 内核

    一.WebKit简介 WebKit是一个开源的浏览器网页排版引擎,包含WebCore排版引擎和JSCore引擎.WebCore和JSCore引擎来自于KDE项目的KHTML和KJS开源项目.Andro ...

  9. Spark案例分析

    一.需求:计算网页访问量前三名 import org.apache.spark.rdd.RDD import org.apache.spark.{SparkConf, SparkContext} /* ...

随机推荐

  1. vscode开发c#

    转载自: http://www.cnblogs.com/lxhbky/p/6673230.html http://www.cnblogs.com/lxhbky/p/6692065.html 一.环境安 ...

  2. L1和L2正则

    https://blog.csdn.net/jinping_shi/article/details/52433975

  3. Confluence 6 数据库表-展现(Appearance)

    这部分存储了有关你 Confluence 的外观和布局使用的信息. decorator 使用自定义 Velocity 布局显示的自定义模板. https://www.cwiki.us/display/ ...

  4. PHP之十六个魔术方法

    1.__construct,__destruct__constuct构建对象的时被调用:__destruct明确销毁对象或脚本结束时被调用:2.__get,__set__set当给不可访问或不存在属性 ...

  5. PHP中json_encode()使用须知,JSON数组和JSON对象

    ⊰ 偷偷的告诉你,这是一个很不谨慎就会踩得坑 ⊱  如下代码 (看了一下很简单,没毛病啊,老铁) $arr = array( '0'=>'a','1'=>'b','2'=>'c',' ...

  6. 对Swoole、Workerman和php自带的socket的理解

    为什么php自带的socket不怎么听说,基本都是用swoole,workerman去实现? 1.PHP的socket扩展是一套socket api,仅此而已. swoole,用C实现,它的socke ...

  7. 使用Spring配置数据源JdbcTemplate

    c3p0作为演示 1.编写资源文件(db.properties) jdbc.user=root jdbc.password=root jdbc.jdbcUrl=jdbc:mysql://localho ...

  8. django----利用Form 实现两次密码输入是否一样 ( 局部钩子和全局钩子 )

    from django import forms # 导入表单模块 from django.core.exceptions import ValidationError class RegisterF ...

  9. git push -u 用法

    在我们第一次提交git的时候: 发现上面用了这个-u参数,也没作解释,特意搜索了下这个-u的用法,加了参数-u后,以后即可直接用git push 代替git push origin master gi ...

  10. sass基础—属性嵌套以及跳出嵌套 @at-root

    /*注意:定义的变量若是没有使用则不会编译到css文件中.*//*1)sass的局部变量*/$font:14px;//定义$font:12px !default; //没有default时是重新赋值, ...