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

所属分类: 软件编程 / java 阅读数: 42
收藏 0 赞 0 分享

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

 

下面讲实现方法:
第一步:使用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);

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

更多精彩内容其他人还在看

Java的面向对象编程基本概念学习笔记整理

这篇文章主要介绍了Java的面向对象编程基本概念学习笔记整理,包括类与方法以及多态等支持面向对象语言中的重要特点,需要的朋友可以参考下
收藏 0 赞 0 分享

Eclipse下编写java程序突然不会自动生成R.java文件和包的解决办法

这篇文章主要介绍了Eclipse下编写java程序突然不会自动生成R.java文件和包的解决办法 的相关资料,需要的朋友可以参考下
收藏 0 赞 0 分享

基于Java实现杨辉三角 LeetCode Pascal's Triangle

这篇文章主要介绍了基于Java实现杨辉三角 LeetCode Pascal's Triangle的相关资料,需要的朋友可以参考下
收藏 0 赞 0 分享

Java中Spring获取bean方法小结

Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架,如何在程序中获取Spring配置的bean呢?下面通过本文给大家介绍Java中Spring获取bean方法小结,对spring获取bean方法相关知识感兴趣的朋友一起学习吧
收藏 0 赞 0 分享

如何计算Java对象占用了多少空间?

在Java中没有sizeof运算符,所以没办法知道一个对象到底占用了多大的空间,但是在分配对象的时候会有一些基本的规则,我们根据这些规则大致能判断出来对象大小,需要的朋友可以参考下
收藏 0 赞 0 分享

剖析Java中的事件处理与异常处理机制

这篇文章主要介绍了Java中的事件处理与异常处理机制,讲解Java是如何对事件或者异常作出响应以及定义异常的一些方法,需要的朋友可以参考下
收藏 0 赞 0 分享

详解Java的Struts2框架的结构及其数据转移方式

这篇文章主要介绍了详解Java的Struts2框架的结构及其数据转移方式,Struts框架是Java的SSH三大web开发框架之一,需要的朋友可以参考下
收藏 0 赞 0 分享

Java封装好的mail包发送电子邮件的类

本文给大家分享了2个java封装好的mail包发送电子邮件的类,并附上使用方法,小伙伴们可以根据自己的需求自由选择。
收藏 0 赞 0 分享

在Java的Struts中判断是否调用AJAX及用拦截器对其优化

这篇文章主要介绍了在Java的Struts中判断是否调用AJAX及用拦截器对其优化的方法,Struts框架是Java的SSH三大web开发框架之一,需要的朋友可以参考下
收藏 0 赞 0 分享

java多线程Future和Callable类示例分享

JAVA多线程实现方式主要有三种:继承Thread类、实现Runnable接口、使用ExecutorService、Callable、Future实现有返回结果的多线程。其中前两种方式线程执行完后都没有返回值,只有最后一种是带返回值的。今天我们就来研究下Future和Callab
收藏 0 赞 0 分享
查看更多