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);

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

相关文章

  • Java 静态数据初始化的示例代码

    Java 静态数据初始化的示例代码

    这篇文章主要介绍了Java 静态数据初始化的示例代码,帮助大家更好的理解和学习Java,感兴趣的朋友可以了解下
    2020-09-09
  • SpringBoot整合MongoDB实现文档存储功能

    SpringBoot整合MongoDB实现文档存储功能

    MongoDB是可以应用于各种规模的企业、各个行业以及各类应用程序的开源数据库,本文将结合MongoDB和SpringBoot实现文档存储功能,需要的可以参考下
    2024-12-12
  • SpringBoot中ApplicationEvent和ApplicationListener用法小结

    SpringBoot中ApplicationEvent和ApplicationListener用法小结

    这篇文章介绍SpringBoot中ApplicationEvent用法,注意ApplicationEvent和MQ队列虽然实现的功能相似,但是MQ还是有其不可替代性的,最本质的区别就是MQ可以用于不同系统之间的消息发布,而SpringEvent这种模式只能在一个系统中,需要的朋友可以参考下
    2023-03-03
  • mybatis插件实现自定义改写表名实例代码

    mybatis插件实现自定义改写表名实例代码

    在数据库操作过程中,经常有修改表名的需求,下面这篇文章主要给大家介绍了关于mybatis插件实现自定义改写表名的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-04-04
  • 自定义注解实现Spring容器注入Bean方式(类似于mybatis的@MapperScans)

    自定义注解实现Spring容器注入Bean方式(类似于mybatis的@MapperScans)

    本文介绍了如何通过自定义注解@MyService和@MyServiceScans在SpringBoot项目中自动将指定包下的类注入Spring容器,详细解释了创建自定义注解、定义包扫描器ClassPathBeanDefinitionScanner的作用与实现
    2024-09-09
  • java括号匹配问题介绍

    java括号匹配问题介绍

    大家好,本篇文章主要讲的是java括号匹配问题介绍,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下,方便下次浏览
    2021-12-12
  • 浅谈Java面向接口编程

    浅谈Java面向接口编程

    本文通过结合接口的本质、面向对象编程与面向接口编程的关系以及一些作者自身的理解,向大家介绍了面向接口编程的一些东西,需要的朋友可以了解下。
    2017-09-09
  • 使用Lombok的@Builder注解带来的两大坑

    使用Lombok的@Builder注解带来的两大坑

    这篇文章主要介绍了使用Lombok的@Builder注解带来的两大坑,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-08-08
  • Dubbo服务校验参数的解决方案

    Dubbo服务校验参数的解决方案

    这篇文章主要介绍了Dubbo服务如何优雅的校验参数,Dubbo框架本身是支持参数校验的,同时也是基于JSR303去实现的,今天通过示例代码介绍下详细实现过程,需要的朋友可以参考下
    2022-03-03
  • spring boot集成smart-doc自动生成接口文档详解

    spring boot集成smart-doc自动生成接口文档详解

    这篇文章主要介绍了spring boot集成smart-doc自动生成接口文档详解,smart-doc是一款同时支持java restful api和Apache Dubbo rpc接口文档生成的工具,smart-doc颠覆了传统类似swagger这种大量采用注解侵入来生成文档的实现方法
    2022-09-09

最新评论