前言:
这是个很常用的操作,一般我们的网站在用户上传图片时都会给图片添加一个水印以防止其他站点盗图的行为
实现功能:①给图片增加文字水印②给图片增加图片水印
一、核心功能实现:
1、添加文字水印
-
- public void mark(BufferedImage bufImg, Image img, String text, Font font, Color color, int x, int y) {
- Graphics2D g = bufImg.createGraphics();
- g.drawImage(img, 0, 0, bufImg.getWidth(), bufImg.getHeight(), null);
- g.setColor(color);
- g.setFont(font);
- g.drawString(text, x, y);
- g.dispose();
- }
2、添加图片水印
-
- public void mark(BufferedImage bufImg, Image img, Image markImg, int width, int height, int x, int y) {
- Graphics2D g = bufImg.createGraphics();
- g.drawImage(img, 0, 0, bufImg.getWidth(), bufImg.getHeight(), null);
- g.drawImage(markImg, x, y, width, height, null);
- g.dispose();
- }
以上两个方法实现了最核心的功能:给图片添加水印。
补充:
为什么要这么写?
考虑到该方法不仅可以用于给图片文件增加水印,而且还可以给视频的每一帧图像也添加,所以为了方便不同场合重复使用,去除了不必要的依赖关系。
有了核心的两个方法就我们可以给图片文件增加水印了
二、功能性实现
1、给图片增加文字水印
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- public void mark(String imgPath, String outImgPath, String text, Font font, Color color, int x, int y) {
- try {
-
- File imgFile = null;
- Image img = null;
- if (imgPath != null) {
- imgFile = new File(imgPath);
- }
- if (imgFile != null && imgFile.exists() && imgFile.isFile() && imgFile.canRead()) {
- img = ImageIO.read(imgFile);
- }
- int imgWidth = img.getWidth(null);
- int imgHeight = img.getHeight(null);
-
- BufferedImage bufImg = new BufferedImage(imgWidth, imgHeight, BufferedImage.TYPE_INT_RGB);
- mark(bufImg, img, text, font, color, x, y);
-
- FileOutputStream outImgStream = new FileOutputStream(outImgPath);
- ImageIO.write(bufImg, "jpg", outImgStream);
- outImgStream.flush();
- outImgStream.close();
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
2、给图片增加图片水印
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- public void mark(String inputImg, String markImg, String outputImg, int width, int height, int x, int y) {
-
- File inputImgFile = null;
- File markImgFile = null;
- Image img = null;
- Image mark = null;
- try {
- if (inputImg != null && markImg != null) {
- inputImgFile = new File(inputImg);
- markImgFile = new File(markImg);
- }
- if (inputImgFile != null && inputImgFile.exists() && inputImgFile.isFile() && inputImgFile.canRead()) {
-
- img = ImageIO.read(inputImgFile);
-
- }
- if (markImgFile != null && markImgFile.exists() && markImgFile.isFile() && markImgFile.canRead()) {
-
- mark = ImageIO.read(markImgFile);
-
- }
- int imgWidth = img.getWidth(null);
- int imgHeight = img.getHeight(null);
- BufferedImage bufImg = new BufferedImage(imgWidth, imgHeight, BufferedImage.TYPE_INT_RGB);
- mark(bufImg, img, mark, width, height, x, y);
- FileOutputStream outImgStream = new FileOutputStream(outputImg);
- ImageIO.write(bufImg, "jpg", outImgStream);
- outImgStream.flush();
- outImgStream.close();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
3、测试一下效果
文字水印的字体和颜色需要自行定义,这里我们使用宋体,14号字体,颜色选择橙色 - -!,坐标是x轴0,y轴等于字体的大小,也就是图片的左上角。
- public static void main(String[] args) {
- Font font = new Font("宋体", Font.PLAIN, 14);
-
-
-
- new MarkText4J().mark("eguidMarkText2.jpg", "eguid.jpg", "eguidMarkText3.jpg", 40, 20, 0, 14);
- }
简直棒极了,至此我们可以随意的给图片任意位置添加任意文字或者图片水印了。
最后,额。。。导出的图片比原本图片还小是什么鬼?欢迎加入讨论群一起讨论:371249677。- -!