场景

一个图片文件查看或者下载前需要加上水印,文件本身存储在共享文件夹下。

共享文件(Smb共享)

mac下共享文件

操作步骤:

  1. 系统偏好设置-共享-文件共享-使用smb共享文件或文件夹,访问用户为guset,密码为空
  2. 系统偏好设置-用户和群组-解锁-客人用户-允许客人登录到这台电脑

百度经验 Mac如何共享文件夹

linux下共享文件

操作步骤:安装smb-创建文件夹-修改smb配置文件-重启smb服务即可

Linux和Windows共享文件的三种方法

Windows下共享文件

操作步骤:创建文件夹-右键设置共享目录-共享用户添加

详细 请移步百度搜索…

操作共享文件

Maven依赖

<dependency><groupId>jcifs</groupId><artifactId>jcifs</artifactId><version>1.3.17</version>
</dependency>

共享文件操作

使用SmbFile类

NtlmPasswordAuthentication auth = new NtlmPasswordAuthentication("", "guest", "");
SmbFile smbFile = new SmbFile("smb://127.0.0.1/shareDir/1.jpg", auth);

图片文件加水印

import jcifs.smb.NtlmPasswordAuthentication;
import jcifs.smb.SmbException;
import jcifs.smb.SmbFile;
import jcifs.smb.SmbFileOutputStream;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.time.StopWatch;import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.font.FontRenderContext;
import java.awt.geom.AffineTransform;
import java.awt.geom.Rectangle2D;
import java.awt.image.BufferedImage;
import java.io.InputStream;
import java.net.MalformedURLException;/*** 远程图片添加水印工具类*/
@Slf4j
public final class FileWatermarkUtils {private static final String IMG_FILE_NAME_SEPARATOR = ".";/*** 水印文字字体名*/private static final String FONT_NAME = "华文楷体";/*** 水印文字样式*/private static final int FONT_STYLE = Font.BOLD;/*** 水印文字颜色*/private static final Color FONT_COLOR = Color.BLACK;/*** 水印文字字体大小*/private static final int FONT_SIZE = 20;/*** 透明度*/private static final float ALPHA = 0.1f;/*** 水印旋转角度*/private static final int DEGREE = -30;/*** 各个水印文字间隔像素-X 根据图片大小 可自行调整*/private static final int OFFSET_GAP_X = 200;/*** 各个水印文字间隔像素-Y 根据图片大小 可自行调整*/private static final int OFFSET_GAP_Y = 100;private FileWatermarkUtils() {}/*** 读取smbFile图片文件 添加水印后 生成到newSmbFile* @param smbFile 原远程图片文件* @param newSmbFile 新的添加水印后的文件* @param watermarkText 添加的水印*/public static void addWatermarkToNewSmbFile(SmbFile smbFile, SmbFile newSmbFile, String watermarkText) {try (InputStream smbFileInputStream = smbFile.getInputStream(); SmbFileOutputStream newSmbFileOutputStream = (SmbFileOutputStream) newSmbFile.getOutputStream()) {log.info("Start to add watermark to image file.");StopWatch stopWatch = new StopWatch();stopWatch.start();// 1、读取输入流,构建Image对象Image src = ImageIO.read(smbFileInputStream);log.info("Read file end, cost {}", stopWatch.getTime());int width = src.getWidth(null);int height = src.getHeight(null);log.info("Get image width and height end, cost {}", stopWatch.getTime());// 2、构建Graphics2DBufferedImage bufferedImage = new BufferedImage(width, height,BufferedImage.TYPE_INT_RGB);Graphics2D graphics2D = bufferedImage.createGraphics();graphics2D.drawImage(src, 0, 0, width, height, null);// 设置字体与颜色Font font = new Font(FONT_NAME, FONT_STYLE, FONT_SIZE);graphics2D.setColor(FONT_COLOR);graphics2D.setFont(font);// 设置透明度graphics2D.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, ALPHA));log.info("Prepare to draw image end, cost {}", stopWatch.getTime());// 3、获取要添加的水印文字所占的像素FontRenderContext context = graphics2D.getFontRenderContext();Rectangle2D stringBounds = font.getStringBounds(watermarkText, context);log.info("Get string bounds end, cost {}", stopWatch.getTime());// 4、绘制水印int textWidthHalf = ((int) stringBounds.getWidth()) >>> 1;int textHeightHalf = ((int) stringBounds.getHeight()) >>> 1;AffineTransform old = graphics2D.getTransform();int positionX = 0;int positionY = 0;while (positionX <= width) {while (positionY <= height) {// 以当前要绘制的文字的中心点为中心进行旋转graphics2D.rotate(Math.toRadians(DEGREE), positionX + textWidthHalf, positionY + textHeightHalf);// 绘制水印graphics2D.drawString(watermarkText, positionX, positionY);// 重置transformgraphics2D.setTransform(old);positionY += OFFSET_GAP_Y;}positionY = 0;positionX += OFFSET_GAP_X;}log.info("Draw watermark text end, cost {}", stopWatch.getTime());// 销毁绘制使用的资源graphics2D.dispose();// 5、添加完水印的文件写到新的远程文件中// 获取文件后缀String filePath = newSmbFile.getPath();String fileSuffix = filePath.substring(filePath.lastIndexOf(IMG_FILE_NAME_SEPARATOR) + 1);// 图片缓存写入新文件ImageIO.write(bufferedImage, fileSuffix, newSmbFileOutputStream);log.info("Save image with watermark to new smb file, cost {}", stopWatch.getTime());stopWatch.stop();} catch (Exception ex) {log.error("FileWatermarkUtils-addWatermarkToSmbFile: add watermark to smb file exception.", ex);}}public static void main(String [] args) throws MalformedURLException, SmbException {NtlmPasswordAuthentication auth = new NtlmPasswordAuthentication("", "guest", "");SmbFile smbImageFile = new SmbFile("smb://127.0.0.1/shareDir/1.jpg", auth);SmbFile newTempImageFileWithWatermark = new SmbFile("smb://127.0.0.1/shareDir/1_temp.jpg", auth);addWatermarkToNewSmbFile(smbImageFile, newTempImageFileWithWatermark, "one piece");// newTempImageFileWithWatermark.delete();}}

水印图片效果:

遇到的问题

生成的图片无法打开


解决:
权限问题,右键图片-显示简介,解锁图片,添加上当前用户的读写权限即可

访问文件时报错

如账号密码错误,文件找不到,没有权限等

jcifs.smb.SmbAuthException: Logon failure: unknown user name or bad password
jcifs.smb.SmbException: The system cannot find the file specified

解决:
仔细检查当前使用的访问用户是否有共享文件夹的读写权限,文件名,文件路径是否正确。可以在windows机器上访问试下,如果能正常访问,程序应该也是可以访问到的。

参考:
SmbFile 类实现局域网文件共享读写
Java 图片加水印(图片或者文本)

如何给共享文件夹中的图片添加水印相关推荐

  1. matlab读取一个文件的图片大小,Matlab读取文件夹中子文件夹中的图片并修改尺寸...

    今天被师兄问到如何利用matlab批处理图片,觉得很简单嘛 就让他去百度 结果只百度到处理文件夹中图片的程序 好吧 这里放上如何处理文件夹中子文件夹的图片 现状:在一个名为casia的文件夹中,里面有 ...

  2. SQL2005学习(九),将数据库备份到网络共享文件夹中

    通常我们的数据库文件和数据库日志文件位于不同的磁盘上,这样既提高了性能也提供了一定的容灾,但是如果我们仅仅把数据库文件和日志文件放在本地的不同磁盘上有时候还是不太保险,万一数据库服务器的主板烧了系统都 ...

  3. 文件保存到服务器失败,Office 2010在服务器共享文件夹中保存文件失败

    服务器:Windows 2003简体中文标准版 with SP2 客户端: 1 Windows XP Pro简体中文 with SP3 + Office 2010 简体中文标准版 2 Windows  ...

  4. python opencv 实现从一个文件夹中读取图片做切割处理后放入另一个文件夹

    python opencv 实现从一个文件夹中读取图片切割处理后放入另一个文件夹. 实现的功能是把一个文件夹里的图片作处理,即把原图片中心为起点切割成1536*1536的图片,原图片必须大于这个的大小 ...

  5. 如何批量导入不同文件夹中的图片

    在标签设计印刷工作中,批量导入图片已经是非常普遍的功能了.不论图片名称是否有规律或者是否有在数据库中保存,经过一些专业的设置都可以实现批量导入.那么如果是不同文件夹中的图片该如何导入呢? 文件夹中图片 ...

  6. 如何把win桌面的压缩包复制到虚拟机共享文件夹中

    如何把win桌面的压缩包复制到虚拟机共享文件夹中 共享文件夹已打开

  7. 为网页中的图片添加水印的效果

    程序本来源于http://dev.csdn.net/develop/article/22/22096.shtm中lovered所写的程序,我把其中的一些我觉得不太好的加以了改进并且增加一些功能形成了该 ...

  8. 使用Python读取文件夹中的图片

    文章目录 Python创建新的文件夹 Python读取文件夹中的图片内容以及存取   一个文件夹中含有大量的图片文件,jpg格式和png格式的.需要从中选出一些比较适合电脑分辨率的,也就是宽度大于高度 ...

  9. java判断文件夹中的图片是否重复

    java判断文件夹中的图片是否重复 直接上代码 package com.example.common; import java.io.File; import java.io.FileInputStr ...

最新文章

  1. nginx子域名 linux,配置nginx服务器 —— Nginx添加多个二级子域名
  2. 无边框窗体的移动(winform/wpf)
  3. CBOX直播故障:正在连接
  4. play框架配置 拦截器_如何使用Play框架为https配置SSL证书
  5. linux c 读取摄像头,Linux下onvif客户端获取ipc摄像头 获取能力:GetCapabilities
  6. LeetCode 1955. 统计特殊子序列的数目
  7. python中arcpy_如何使用ArcPy?
  8. 凭借UGC壮大的马蜂窝,亦是喜忧参半
  9. jvm 字节码jclasslib解读
  10. color 常用色值
  11. Atitit q2016 q0 doc list on home ntpc.docx
  12. 初中英语语法(018)-间接疑问句
  13. druid监控页面 关闭_druid-springboot-starter默认启用监控页面,公网项目可能外泄DB信息...
  14. php市场占比 2019,2019年家电市场份额占比排名
  15. 深信服2018校园招聘C++工程师编程题 - 题解
  16. Ubuntu 10.10安装配置指南Ubuntu 11.10 图形安装教程
  17. python证明冰雹猜想_如果冰雹猜想被证明了。那数学会有很大突破吗?
  18. 机器学习算法基础之使用python代码
  19. R语言一种无偏变量选择的多元统计方法
  20. 联发科全网通MT6755核心板资料,MT6755芯片模块物联网方案

热门文章

  1. 反复p图、修图,照片画质低如何修复模糊图片为高清?
  2. JESD79-4 第4章 SDRAM命令描述与操作(4.24)
  3. npm scripts详解
  4. 如何让键盘支持自动输入
  5. java判断任意两数的最小公倍数和最大公约数
  6. 移动端记账本部署gitee Pages
  7. yii rules最全规则
  8. 计算机软件发展的指标,信息化发展指数
  9. 李迟2022年10月工作生活总结
  10. KgoUI(1) 之 技术选型angular 和 vue