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

 更新时间:2016年06月26日 11:12:15   作者:Mr_Smile2014  
这篇文章主要为大家详细介绍了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);

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

相关文章

  • spring中前端明明传了值后端却接收不到问题解决办法

    spring中前端明明传了值后端却接收不到问题解决办法

    在学习Spring的时候遇到了一个问题,后台一直接收不到前台传递过来的参数,耽误了好长时间终于找到了原因,这篇文章主要给大家介绍了关于spring中前端明明传了值后端却接收不到问题的解决办法,需要的朋友可以参考下
    2024-05-05
  • 使用mybatisPlus生成oracle自增序列遇到的坑及解决

    使用mybatisPlus生成oracle自增序列遇到的坑及解决

    这篇文章主要介绍了使用mybatisPlus生成oracle自增序列遇到的坑及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-03-03
  • Spring基于常用AspectJ切点表达式使用介绍

    Spring基于常用AspectJ切点表达式使用介绍

    AspectJ是一个基于Java语言的AOP框架,使用AspectJ需要导入Spring AOP和AspectJ相关jar包,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-12-12
  • Java实现矩形碰撞检测

    Java实现矩形碰撞检测

    这篇文章主要为大家详细介绍了Java实现矩形碰撞检测,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-06-06
  • Mybatis-Plus支持GBase8s分页查询的实现示例

    Mybatis-Plus支持GBase8s分页查询的实现示例

    本文主要介绍了使 Mybatis-Plus 支持 GBase8s 的分页查询,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-01-01
  • java中获取json的所有key方法

    java中获取json的所有key方法

    下面小编就为大家分享一篇java中获取json的所有key方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-03-03
  • String中intern方法的使用场景详解

    String中intern方法的使用场景详解

    这篇文章主要给大家介绍了关于String中intern方法的使用场景,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09
  • 详解Java匿名内部类

    详解Java匿名内部类

    这篇文章介绍了Java匿名内部类的实现,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-12-12
  • 解决maven maven.compiler.source和maven.compiler.target的坑

    解决maven maven.compiler.source和maven.compiler.target的坑

    这篇文章主要介绍了解决maven maven.compiler.source和maven.compiler.target的坑,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12
  • 微信小程序完整项目实战记录(前端+SpringBoot后端)

    微信小程序完整项目实战记录(前端+SpringBoot后端)

    随着微信小程序的流行,越来越多的开发者开始涉足小程序开发,下面这篇文章主要给大家介绍了关于微信小程序完整项目实战的相关资料,项目包括前端+SpringBoot后端,需要的朋友可以参考下
    2024-09-09

最新评论