Java用自带的Image IO给图片添加水印

网友投稿 241 2023-01-07

Java用自带的Image IO给图片添加水印

1.  文字水印

可以设置文字透明度

g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, 0.8f));

2.  旋转文字

画矩形框

3.  旋转坐标轴

结合下载功能,完整的代码如下:

/**

* 下载

*/

@

GetMapping("/download")

public void download(@RequestParam("mediaId") String mediaId, HttpServletRequest request, HttpServletResponse response) throws IOException

{

SysFile sysFile = sysFileService.getByMediaId(mediaId);

if(null == sysFile)

{

throw new IllegalArgumentException("文件不存在");

}

String mimeType = request.getServletContext().getMimeType(sysFile.getPath());

System.out.println(mimeType);

response.setContentType(sysFile.getContentType());

response.setHeader(HttpHeaders.CONTENT_DISPOSITION, "attachment;filename=" + URLEncoder.encode(sysFile.getOriginalFilename(), "UTF-8"));

// FileInputStream fis = new FileInputStream(sysFile.getPath());

ServletOutputStream sos = response.getOutputStream();

WatermarkUtil.addText(sysFile.getPath(), "哈哈哈哈", sos);

// IOUtils.copy(fis, sos);

// IOUtils.closeQuietly(fis);

IOUtils.closeQuietly(sos);

}

另外的写法

import javax.imageio.ImageIO;

import java.awt.*;

import java.awt.image.BufferedImage;

import java.io.File;

import java.io.FileOutputStream;

/**

* @ProjectName: test

* @Package: com.test.utils

* @ClassName: MyTest

* @Author: luqiming

* @Description:

* @Date: 2020/10/29 11:48

* @Version: 1.0

*/

public class AddWatermarkUtil {

public static void waterPress(String srcImgPath, String outImgPath,

Color markContentColor, int fontSize, String waterMarkContent) {

try {

String[] waterMarkContents = waterMarkContent.split("\\|\\|");

// 读取原图片信息

File srcImgFile = new File(srcImgPath);

Image srcImg = ImageIO.read(srcImgFile);

int srcImgWidth = srcImg.getWidth(null);

int srcImgHeight = srcImg.getHeight(null);

// 加水印

BufferedImage bufImg = new BufferedImage(srcImgWidth, srcImgHeight, BufferedImage.TYPE_INT_RGB);

// 得到画笔对象

Graphics2D g = bufImg.createGraphics();

// 设置起点

g.drawImage(srcImg, 0, 0, srcImgWidth, srcImgHeight, null);

Font font = new Font("宋体", Font.PLAIN, fontSize);

// 根据图片的背景设置水印颜色

g.setColor(markContentColor);

// 设置水印文字字体

g.setFont(font);

// 数组长度

int contentLength = waterMarkContents.length;

// 获取水印文字中最长的

int maxLength = 0;

for (int i = 0; i < contentLength; i++) {

int fontlen = getWatermarkLength(waterMarkContents[i], g);

if (maxLength < fontlen) {

maxLength = fontlen;

}

}

for (int j = 0; j < contentLength; j++) {

waterMarkContent = waterMarkContents[j];

int tempX = 10;

int tempY = fontSize;

// 单字符长度

int tempCharLen = 0;

// 单行字符总长度临时计算

int tempLineLen = 0;

StringBuffer sb = new StringBuffer();

for (int i = 0; i < waterMarkContent.length(); i++) {

char tempChar = waterMarkContent.charAt(i);

tempCharLen = getCharLen(tempChar, g);

tempLineLen += tempCharLen;

if (tempLineLen >= srcImgWidth) {

// 长度已经满一行,进行文字叠加

g.drawString(sb.toString(), tempX, tempY);

// 清空内容,重新追加

sb.delete(0, sb.length());

tempLineLen = 0;

}

// 追加字符

sb.append(tempChar);

}

// 通过设置后两个输入参数给水印定位

g.drawString(sb.toString(), 20, srcImgHeight - (contentLength - j - 1) * tempY-50);

}

g.dispose();

// 输出图片

FileOutputStream outImgStream = new FileOutputStream(outImgPath);

ImageIO.write(bufImg, "jpg", outImgStream);

outImgStream.flush();

outImgStream.close();

} catch (Exception e) {

e.printStackTrace();

}

}

public static int getCharLen(char c, Graphics2D g) {

return g.getFontMetrics(g.getFont()).charWidth(c);

}

/**

* 获取水印文字总长度

*

* @paramwaterMarkContent水印的文字

* @paramg

* @return水印文字总长度

*/

public static int getWatermarkLength(String waterMarkContent, Graphics2D g) {

return g.getFontMetrics(g.getFont()).charsWidth(

waterMarkContent.toCharArray(), 0, waterMarkContent.length());

}

public static void main(String[] args) {

// 原图位置, 输出图片位置, 水印文字颜色, 水印文字

String font = "张天爱||就很完美||2020-05-27 17:00:00";

String inputAddress = "F:/UpupooWallpaper/1.jpg";

String outputAddress = "F:/UpupooWallpaper/1.jpg";

Color color = Color.GREEN;

waterPress(inputAddress, outputAddress, color, 50, font);

}

}

添加效果

关于水印位置,需要修改:

//左下角

g.drawString(sb.toString(), 0, srcImgHeight - (contentLength - j - 1) * tempY);

//右下角

g.drawString(sb.toString(), srcImgWidth - maxLength, srcImgHeight - (contentLength - j - 1) * tempY);

以上就是Java用自带的Image IO给图片添加水印的详细内容,更多关于Java 图片添加水印的资料请关注我们其它相关文章!

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

上一篇:Java实现简易的分词器功能
下一篇:洛阳快递物流查询单号电话(洛阳快递物流查询单号电话是多少)
相关文章

 发表评论

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