java实现倾斜水印铺满整张图

作者:Mr_Smile2014 时间:2023-12-24 22:34:21 

今天遇到一个需求对上传的图铺满水印,在网上找了半天都是在指定位置设置水印,下面代码是我通过在网上找的代码,然后改造而成的。我们先看一下效果图

 java实现倾斜水印铺满整张图

下面讲实现方法:
第一步:使用ps或美图软件设计水印图片,比如:

java实现倾斜水印铺满整张图 

第二步:把下面代码放入类中:


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);
标签:java,水印
0
投稿

猜你喜欢

  • Java实现指定线程执行顺序的三种方式示例

    2021-08-16 15:11:34
  • 总结Java的Struts框架的异常处理方法

    2022-04-12 01:29:44
  • Flutter WebView 预加载实现方法(Http Server)

    2023-06-25 23:14:35
  • Android调用系统的发邮件功能的小例子

    2022-09-09 04:23:11
  • Spring实战之使用@Resource配置依赖操作示例

    2023-08-06 10:11:13
  • java使用链表实现约瑟夫环

    2022-03-21 18:59:35
  • c#连接excel示例分享

    2023-08-10 07:42:04
  • Android Studio实现简易进制转换计算器

    2023-09-17 04:19:29
  • SpringBoot资源文件的存放位置设置方式

    2023-02-26 10:37:00
  • 解决使用json-lib包实现xml转json时空值被转为空中括号的问题

    2022-10-20 02:12:14
  • maven工程中jar包瘦身的五种方法

    2023-11-04 05:01:54
  • Android实现语音识别代码

    2022-06-03 03:26:33
  • Android 自定义View实现任意布局的RadioGroup效果

    2021-08-07 16:20:24
  • Handler实现线程之间的通信下载文件动态更新进度条

    2021-10-27 16:50:36
  • Android实现文字上下滚动效果

    2023-02-02 07:40:00
  • Java Spring事务的隔离级别详解

    2022-04-25 23:07:52
  • 详解Mybatis中的PooledDataSource

    2022-10-24 18:08:11
  • Unity实现虚拟键盘

    2022-05-24 11:25:38
  • 关于国际化、OGNL表达式语言

    2023-09-04 15:20:45
  • Unity使用物理引擎实现多旋翼无人机的模拟飞行

    2021-09-25 04:11:40
  • asp之家 软件编程 m.aspxhome.com