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

网友投稿 427 2023-07-13


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

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

下面讲实现方法:

第一步:使用pshttp://或美图软件设计水印图片,比如:

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

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

* 水印图片旋转角度

*/

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


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:BootStrap Progressbar 实现大文件上传的进度条的实例代码
下一篇:WIN7系统JavaEE(java)环境配置教程(一)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~