主要用JAVA 的 awt 给FTP图片添加水印
添加水印核心方法
/**
* 添加水印核心方法
* @param bufImg
* @param img
* @param text
* @param font
* @param color
* @param x
* @param y
*/
private static void mark(BufferedImage bufImg, Image img, List text, Font font, Color color, int x, List y) {
Graphics2D g = bufImg.createGraphics();
g.drawImage(img, 0, 0, bufImg.getWidth(), bufImg.getHeight(), null);
g.setColor(color);
g.setFont(font);
if( text != null && text.size() > 0){
for (int i = 0; i < text.size(); i++) {
g.drawString(text.get(i), x, y.get(i));
}
}
g.dispose();
}
给图片添加文字水印
/**
* 给图片增加文字水印
*
* @param inputStream
* -文件的IO流
* @param longitude
* -经度
* @param latitude
* -纬度
* @param address
* -地址
* @param currentTime
* -时间
* @param color
* -颜色
*/
private static InputStream mark(InputStream inputStream, String longitude ,String latitude,String address,String currentTime, Color color) {
try {
Image img = ImageIO.read(inputStream);
// 读取原图片信息
int imgWidth = img.getWidth(null);
int imgHeight = img.getHeight(null);
int x = 50;
// 加水印
BufferedImage bufImg = new BufferedImage(imgWidth, imgHeight, BufferedImage.TYPE_INT_RGB);
Font font = new Font("宋体", Font.PLAIN, 40);
java.util.List textList = Lists.newArrayList();
textList.add("经度: "+longitude);
textList.add("纬度: "+latitude);
textList.add("地址: "+address);
textList.add("时间: "+currentTime);
List yList = Lists.newArrayList();
yList.add(imgHeight-180);
yList.add(imgHeight-130);
yList.add(imgHeight-80);
yList.add(imgHeight-30);
mark(bufImg, img, textList, font, color, x, yList);
ByteArrayOutputStream bs = new ByteArrayOutputStream();
ImageOutputStream imOut = ImageIO.createImageOutputStream(bs);
ImageIO.write(bufImg, "jpg", imOut);
InputStream is = new ByteArrayInputStream(bs.toByteArray());
return is;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
编辑FTP图片
/**
* 上传文件
*
* @param pathname 路径名称
* @param fileName 文件名称
* @param longitude 经度
* @param latitude 纬度
* @param address 地址
* @param currentTime 时间
* @return
*/
public static boolean waterMark(String pathname, String fileName, String longitude , String latitude, String address, String currentTime) {
InputStream inputStream = null;
InputStream is = null;
FTPClient ftpClient = null;
try {
ftpClient = initFtpClient();
ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
CreateDirecroty(pathname,ftpClient);
ftpClient.makeDirectory(pathname);
ftpClient.changeWorkingDirectory(pathname);
ftpClient.enterLocalPassiveMode();
log.info("开始添加水印,路径:{},文件名:{}", pathname, fileName);
inputStream = ftpClient.retrieveFileStream(fileName);
is = mark(inputStream, longitude,latitude,address,currentTime, Color.WHITE);
//操作多文件时候,必须调用completePendingCommand释放,否则FTP会断开连接
ftpClient.completePendingCommand();
ftpClient.storeFile(attach.getAttachFilename(), is);
ftpClient.logout();
log.info("水印添加成功");
} catch (Exception e) {
log.info("水印添加失败");
e.printStackTrace();
return false;
} finally {
try {
if (ftpClient.isConnected()) {
ftpClient.disconnect();
}
if (inputStream != null) {
inputStream.close();
}
if (is != null) {
is.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
return true;
}
/**
* 初始化ftp服务器
*/
private static FTPClient initFtpClient() {
FTPClient ftpClient = new FTPClient();
ftpClient.setControlEncoding("utf-8");
try {
log.info("connecting...ftp服务器:" + HOST_NAME + ":" + PORT);
//连接ftp服务器
ftpClient.connect(HOST_NAME, PORT);
//登录ftp服务器
ftpClient.login(USERNAME, PASSWORD);
//是否成功登录服务器
int replyCode = ftpClient.getReplyCode();
if (!FTPReply.isPositiveCompletion(replyCode)) {
log.info("connect failed...ftp服务器:" + HOST_NAME + ":" + PORT);
} else {
log.info("connect successful...ftp服务器:" + HOST_NAME + ":" + PORT);
}
ftpClient.setBufferSize(bufferSize);
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return ftpClient;
}
方法在WINDOWS下运行,简直六到飞起,一部署到docker中,中文就乱码!!!
各种给LIUNX系统中加字体都没有解决,最后是通过Dockerfile添加字体,在容器内部直接加载字体,OK,完美解决。
首先在Dockerfile中创建fonts目录,将需要的字体放入该目录下,WINDOWS下字体在 C:\Windows\Fonts 目录下。
COPY fonts /usr/share/fonts/
RUN yum -y install fontconfig \
&& cd /usr/share/fonts \
&& fc-cache
Dockerfile文件追加这部分内容,中文乱码完全OK~~~
最后贴张效果图