java实现倾斜水印铺满整张图
作者:Mr_Smile2014 发布时间:2023-12-24 22:34:21
标签:java,水印
今天遇到一个需求对上传的图铺满水印,在网上找了半天都是在指定位置设置水印,下面代码是我通过在网上找的代码,然后改造而成的。我们先看一下效果图
下面讲实现方法:
第一步:使用ps或美图软件设计水印图片,比如:
第二步:把下面代码放入类中:
package org.platform.framework.commons.util;
import java.awt.AlphaComposite;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.RenderingHints;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import com.founder.cms.watermark.util.ImageMarkLogoUtil;
/**
*
* 生成水印
*
*/
public class ImageMarkUtil {
/** 水印透明度 */
private static float alpha = 0.5f;
/** 水印图片旋转角度 */
private static double degree = 0f;
private static int interval = 0;
/**
* 设置水印参数,不设置就使用默认值
*
* @param alpha
* 水印透明度
* @param degree
* 水印图片旋转角度 *
* @param interval
* 水印图片间隔
*/
public static void setImageMarkOptions(float alpha, int degree,
int interval) {
if (alpha != 0.0f) {
ImageMarkUtil.alpha = alpha;
}
if (degree != 0f) {
ImageMarkUtil.degree = degree;
}
if (interval != 0f) {
ImageMarkUtil.interval = interval;
}
}
/**
* 给图片添加水印图片
*
* @param waterImgPath
* 水印图片路径
* @param srcImgPath
* 源图片路径
* @param targerPath
* 目标图片路径
*/
public static void waterMarkByImg(String waterImgPath, String srcImgPath,
String targerPath) throws Exception {
waterMarkByImg(waterImgPath, srcImgPath, targerPath, 0);
}
/**
* 给图片添加水印图片
*
* @param waterImgPath
* 水印图片路径
* @param srcImgPath
* 源图片路径
* @param targerPath
* 目标图片路径
*/
public static void waterMarkByImg(String waterImgPath, String srcImgPath) {
try {
waterMarkByImg(waterImgPath, srcImgPath, srcImgPath, 0);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* 给图片添加水印图片、可设置水印图片旋转角度
*
* @param waterImgPath
* 水印图片路径
* @param srcImgPath
* 源图片路径
* @param targerPath
* 目标图片路径
* @param degree
* 水印图片旋转角度
*/
public static void waterMarkByImg(String waterImgPath, String srcImgPath,
String targerPath, double degree) throws Exception {
OutputStream os = null;
try {
Image srcImg = ImageIO.read(new File(srcImgPath));
BufferedImage buffImg = new BufferedImage(srcImg.getWidth(null),
srcImg.getHeight(null), BufferedImage.TYPE_INT_RGB);
// 1、得到画笔对象
Graphics2D g = buffImg.createGraphics();
// 2、设置对线段的锯齿状边缘处理
g.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
RenderingHints.VALUE_INTERPOLATION_BILINEAR);
g.drawImage(srcImg.getScaledInstance(srcImg.getWidth(null), srcImg
.getHeight(null), Image.SCALE_SMOOTH), 0, 0, null);
// 3、设置水印旋转
if (0 != degree) {
g.rotate(Math.toRadians(degree),
(double) buffImg.getWidth() / 2, (double) buffImg
.getHeight() / 2);
}
// 4、水印图片的路径 水印图片一般为gif或者png的,这样可设置透明度
ImageIcon imgIcon = new ImageIcon(waterImgPath);
// 5、得到Image对象。
Image img = imgIcon.getImage();
g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP,
alpha));
// 6、水印图片的位置
for (int height = interval + imgIcon.getIconHeight(); height < buffImg
.getHeight(); height = height +interval+ imgIcon.getIconHeight()) {
for (int weight = interval + imgIcon.getIconWidth(); weight < buffImg
.getWidth(); weight = weight +interval+ imgIcon.getIconWidth()) {
g.drawImage(img, weight - imgIcon.getIconWidth(), height
- imgIcon.getIconHeight(), null);
}
}
g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER));
// 7、释放资源
g.dispose();
// 8、生成图片
os = new FileOutputStream(targerPath);
ImageIO.write(buffImg, "JPG", os);
System.out.println("图片完成添加水印图片");
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (null != os)
os.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
System.out.println("..添加水印图片开始...");
/**
* watermarkPath 水印图片地址 uploadPath 上传成功后文件地址
*/
//修改默认参数
//ImageMarkUtil.setImageMarkOptions(0.0f, 0,
20);
//ImageMarkUtil.waterMarkByImg(watermarkPath, uploadPath);
System.out.println("..添加水印图片结束...");
}
}
第三步:在实现上传成功的地方,调用该类,如:
/**
* watermarkPath 水印图片地址
* uploadPath 上传成功后文件地址
*/
ImageMarkUtil.waterMarkByImg(watermarkPath, uploadPath);如果你觉得水印间隔太近了,可以通过下面代码设置间隔:
//修改默认参数
ImageMarkUtil.setImageMarkOptions(0.0f, 0,
20);
ImageMarkUtil.waterMarkByImg(watermarkPath, uploadPath);
0
投稿
猜你喜欢
- 我就废话不多说了,大家还是直接看代码吧~package com.cloudtech.web.util; import java.io.Buf
- 先扯再说最近一直在研究某个国产开源的MySQL数据库中间件,拉下其最新版的代码到eclipse后,启动起来,然后做各种测试和代码追踪;用完想
- 概述在JDK 1.8里,可以使用如下代码获取List元素对象中某个属性的列表。package test;import java.util.A
- 普通校验导入依赖:默认的报错:没有提示具体的属性设置自己的错误信息提示:创建 ValidationMessages.properties内容
- 本文我将要介绍一下mybatis的框架原理,以及mybatis的入门程序,实现用户的增删改查,她有什么优缺点以及mybatis和hibern
- monaco editor创建//创建和设置值if (!this.monacoEditor) { this.monacoEdit
- 项目需求最近项目中有一个需求就是让Java代码去代替人工操作,自动生成PPT,具体就是查询数据库数据,然后根据模板文件(PPT),将数据库数
- 直接贴上代码,里面都有注释/// <summary> &n
- 高并发下restTemplate的错误分析1. 问题现象和分析org.apache.http.conn.ConnectionPoolTime
- 首先我们看一下hibernate的主配置文件<!DOCTYPE hibernate-configuration PUBLIC &nbs
- 一、Quartz的特点* 按作业类的继承方式来分,主要有以下两种:1.作业类继承org.springframework.scheduling
- 前言SQL注入漏洞作为WEB安全的最常见的漏洞之一,在java中随着预编译与各种ORM框架的使用,注入问题也越来越少。新手代码审计者往往对J
- 简介DataBinding 是 Jetpack 组件之一,适用于 MVVM 模式开发,也是Google官方推荐使用的组件之一。使用DataB
- 环境搭建spring boot的简介以往我们开发时用到spring总是避免不了繁琐的配置,例如我们要配置一个数据库连接,可能需要以下几步:1
- 一.线程不安全多线程的执行环境中,程序的执行结果和预期的结果不符合,这就称为发生了线程不安全现象二.那些情况导致了线程不安全?大致分为以下5
- import java.io.File;import java.io.FileNotFoundException;import java.i
- 并发与并行:并行: 指两个或多个事件在同一时刻发生 ( 同时发生 ) 。并发: 指两个或多个事件在同一个时间段内发生。多线程使用场景:1.
- 我们先要记住三者的特征:String 字符串常量StringBuffer 字符串变量(线程安全)StringBuilder 字符串变量(非线
- 详解Java对象的强、软、弱和虚引用+ReferenceQueue一、强引用(StrongReference)强引用是使用最普遍的引用。如果
- 这篇文章主要介绍了Spring Bean初始化及销毁多种实现方式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值