Commit 6bf0d4a1 authored by 赵啸非's avatar 赵啸非

添加水印图片

parent 7c1abef7
...@@ -159,6 +159,12 @@ ...@@ -159,6 +159,12 @@
<artifactId>javase</artifactId> <artifactId>javase</artifactId>
<version>3.4.1</version> <version>3.4.1</version>
</dependency> </dependency>
<dependency>
<groupId>net.coobird</groupId>
<artifactId>thumbnailator</artifactId>
<version>0.4.20</version>
</dependency>
</dependencies> </dependencies>
<build> <build>
......
...@@ -2,6 +2,9 @@ package com.mortals.xhx.common.utils; ...@@ -2,6 +2,9 @@ package com.mortals.xhx.common.utils;
import com.mortals.xhx.module.record.web.ApplyLogController; import com.mortals.xhx.module.record.web.ApplyLogController;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import net.coobird.thumbnailator.Thumbnails;
import net.coobird.thumbnailator.filters.Watermark;
import net.coobird.thumbnailator.geometry.Positions;
import javax.imageio.ImageIO; import javax.imageio.ImageIO;
import javax.swing.*; import javax.swing.*;
...@@ -9,6 +12,7 @@ import java.awt.*; ...@@ -9,6 +12,7 @@ import java.awt.*;
import java.awt.image.BufferedImage; import java.awt.image.BufferedImage;
import java.io.File; import java.io.File;
import java.io.FileOutputStream; import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream; import java.io.OutputStream;
@Slf4j @Slf4j
...@@ -24,6 +28,21 @@ public class WatermarkImgUtils { ...@@ -24,6 +28,21 @@ public class WatermarkImgUtils {
* @return void * @return void
*/ */
public static void addWatermark(String sourceImgPath, String tarImgPath, String waterMarkContent,String fileExt){ public static void addWatermark(String sourceImgPath, String tarImgPath, String waterMarkContent,String fileExt){
//todo
try {
BufferedImage read = ImageIO.read(new File(sourceImgPath));
BufferedImage bi = waterMarkByText(read.getWidth(),read.getHeight(),waterMarkContent,Color.RED,
new Font("宋体", Font.BOLD, 100),45.0,0.3f,sourceImgPath);
ImageIO.write(bi, fileExt, new File(tarImgPath));
} catch (IOException e) {
log.error("添加水印失败",e);
}
/* return;
Font font = new Font("宋体", Font.BOLD, 100);//水印字体,大小 Font font = new Font("宋体", Font.BOLD, 100);//水印字体,大小
Color markContentColor = Color.red;//水印颜色 Color markContentColor = Color.red;//水印颜色
Integer degree = 45;//设置水印文字的旋转角度 Integer degree = 45;//设置水印文字的旋转角度
...@@ -59,7 +78,7 @@ public class WatermarkImgUtils { ...@@ -59,7 +78,7 @@ public class WatermarkImgUtils {
g.drawString(waterMarkContent, width-150 , - 280); g.drawString(waterMarkContent, width-150 , - 280);
/* for(int j=0;j<rowsNumber;j++){ *//* for(int j=0;j<rowsNumber;j++){
boolean bool=false; boolean bool=false;
for(int i=0;i<columnsNumber;i++){ for(int i=0;i<columnsNumber;i++){
g.drawString(waterMarkContent, i*width + j*width, -i*width + j*width);//画出水印,并设置水印位置 g.drawString(waterMarkContent, i*width + j*width, -i*width + j*width);//画出水印,并设置水印位置
...@@ -67,7 +86,7 @@ public class WatermarkImgUtils { ...@@ -67,7 +86,7 @@ public class WatermarkImgUtils {
break; break;
} }
if (bool) break; if (bool) break;
}*/ }*//*
g.dispose();// 释放资源 g.dispose();// 释放资源
// 输出图片 // 输出图片
log.info("生成水印图片路径:{}",tarImgPath); log.info("生成水印图片路径:{}",tarImgPath);
...@@ -85,13 +104,122 @@ public class WatermarkImgUtils { ...@@ -85,13 +104,122 @@ public class WatermarkImgUtils {
e.printStackTrace(); e.printStackTrace();
e.getMessage(); e.getMessage();
} }
}*/
}
/**
* 生成背景透明的 文字水印
*
* @param width 生成图片宽度
* @param height 生成图片高度
* @param text 水印文字
* @param color 颜色对象
* @param font awt字体
* @param degree 水印文字旋转角度
* @param alpha 水印不透明度0f-1.0f
* @param imagePath 图片地址
*/
public static BufferedImage waterMarkByText(int width, int height, String text, Color color, Font font, Double degree, float alpha, String imagePath) {
BufferedImage buffImg = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
// 得到画笔对象
Graphics2D g2d = buffImg.createGraphics();
// 增加下面的代码使得背景透明
buffImg = g2d.getDeviceConfiguration().createCompatibleImage(width, height, Transparency.TRANSLUCENT);
g2d.dispose();
g2d = buffImg.createGraphics();
// 设置对线段的锯齿状边缘处理
g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
//把源图片写入
if (imagePath != null && !imagePath.equals("")) {
try {
Image srcImg = ImageIO.read(new File(imagePath));
Image image = srcImg.getScaledInstance(srcImg.getWidth(null), srcImg.getHeight(null), Image.SCALE_SMOOTH);
g2d.drawImage(image, 0, 0, null);
} catch (IOException e) {
log.error("生成水印图片异常:",e);
}
}
// 设置水印旋转
if (null != degree) {
//注意rotate函数参数theta,为弧度制,故需用Math.toRadians转换一下
//以矩形区域中央为圆心旋转
g2d.rotate(Math.toRadians(degree), (double) buffImg.getWidth() / 2, (double) buffImg.getHeight() / 2);
}
// 设置颜色
g2d.setColor(color);
// 设置 Font
g2d.setFont(font);
// 设置透明度:1.0f为透明度 ,值从0-1.0,依次变得不透明
g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, alpha));
// 获取真实宽度
float realWidth = getRealFontWidth(text);
float fontSize = font.getSize();
// 计算绘图偏移x、y,使得使得水印文字在图片中居中,x、y坐标是基于Graphics2D.rotate过后的坐标系
float x = 0.5f * width - 0.5f * fontSize * realWidth;
float y = 0.5f * height + 0.5f * fontSize;
// 取绘制的字串宽度、高度中间点进行偏移,使得文字在图片坐标中居中
g2d.drawString(text, x, y);
// 释放资源
g2d.dispose();
return buffImg;
}
/**
* 获取真实字符串宽度,ascii字符占用0.5,中文字符占用1.0
*
* @param text 文字
* @return 宽度
*/
private static float getRealFontWidth(String text) {
int len = text.length();
float width = 0f;
for (int i = 0; i < len; i++) {
if (text.charAt(i) < 256) {
width += 0.5f;
} else {
width += 1.0f;
}
} }
return width;
} }
public static void main(String[] args) {
WatermarkImgUtils.addWatermark("E:\\pic\\1724379763618.jpg", "E:\\pic\\1724379763618_water1.jpg", "广安市一业一证(照)一码", "jpg"); public static void main(String[] args) throws IOException {
WatermarkImgUtils.addWatermark("E:\\pic\\1724379763618.jpg", "E:\\pic\\1724379763618_water5.jpg", "广安市一业一证(照)一码", "png");
/*
File watermarkFile = new File("watermark.png");
BufferedImage watermarkImage = ImageIO.read(watermarkFile);
Watermark watermark = new Watermark(Positions.CENTER, watermarkImage, 0.5f);
Thumbnails.of("E:\\pic\\1724379763618.jpg").watermark(watermark).toFile("E:\\pic\\1724379763618_water2.jpg");
*/
//int width, int height, String text, Color color, Font font, Double degree, float alpha, String imagePath
/* String sourceImage="E:\\pic\\1724379763618.jpg";
BufferedImage read = ImageIO.read(new File(sourceImage));
try {
BufferedImage bi = waterMarkByText(read.getWidth(),read.getHeight(),"广安市一业一证(照)一码",Color.RED,
new Font("宋体", Font.BOLD, 100),45.0,0.3f,sourceImage);
ImageIO.write(bi, "png", new File("E:\\pic\\1724379763618_water3.png"));
} catch (IOException e) {
e.printStackTrace();
}*/
} }
} }
...@@ -21,6 +21,8 @@ import com.mortals.xhx.module.certificate.model.vo.CertificateDocumentPdu; ...@@ -21,6 +21,8 @@ import com.mortals.xhx.module.certificate.model.vo.CertificateDocumentPdu;
import com.mortals.xhx.module.certificate.service.CertificateCatalogService; import com.mortals.xhx.module.certificate.service.CertificateCatalogService;
import com.mortals.xhx.module.certificate.service.CertificateDocumentService; import com.mortals.xhx.module.certificate.service.CertificateDocumentService;
import com.mortals.xhx.module.certificate.service.CertificateIndustryService; import com.mortals.xhx.module.certificate.service.CertificateIndustryService;
import net.coobird.thumbnailator.Thumbnailator;
import net.coobird.thumbnailator.Thumbnails;
import org.apache.poi.ss.usermodel.PictureData; import org.apache.poi.ss.usermodel.PictureData;
import org.springframework.beans.BeanUtils; import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
...@@ -318,7 +320,9 @@ public class ApplyLogController extends BaseCRUDJsonBodyMappingController<ApplyL ...@@ -318,7 +320,9 @@ public class ApplyLogController extends BaseCRUDJsonBodyMappingController<ApplyL
0, //y坐标修正值。 默认在中间,偏移量相对于中间偏移 0, //y坐标修正值。 默认在中间,偏移量相对于中间偏移
0.5f//透明度:alpha 必须是范围 [0.0, 1.0] 之内(包含边界值)的一个浮点数字 0.5f//透明度:alpha 必须是范围 [0.0, 1.0] 之内(包含边界值)的一个浮点数字
); );
//Thumbnails.of()
// new Thumbnailator();
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment