设为首页 收藏本站
查看: 1912|回复: 0

[经验分享] 图片水印

[复制链接]

尚未签到

发表于 2017-3-3 08:07:41 | 显示全部楼层 |阅读模式
  谁用maven工程来开发,并且是用struts框架,算是用来回忆一下struts的使用
  水印接口类,定义一些属性和加水印的方法
  WterMark.java



package youth.hong.watermark;
import java.awt.Color;
import java.awt.Font;
import java.io.File;
public interface WaterMark {
public static final int X = 300;
public static final int Y = 300;
public static final int FONT_STYLE = Font.BOLD;
public static final Color FONT_COLOR = Color.BLACK;
public static final int FONT_SIZE = 50;
public static final String MARK_TEXT = "谢谢慕课";
public static final String FONT_NAME = "微软雅黑";
public static final float ALPHA = 0.3f;
public static final String IMAGE_WATER = "blue015.png";
public String watermark(File file, String uploadPath, String realUploadPath, String fileFileName,
String fileContextType);

}
  文字水印
  FontWaterMark.java



package youth.hong.watermark;
import java.awt.AlphaComposite;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import javax.imageio.ImageIO;
public class FontWaterMark implements WaterMark {
@Override
public String watermark(File file, String uploadPath, String realUploadPath, String fileFileName,
String fileContextType) {
OutputStream out = null;
try {
out = new FileOutputStream(realUploadPath + "/font_" + fileFileName);
Image image = ImageIO.read(file);
int width = image.getWidth(null);
int height = image.getHeight(null);
BufferedImage bi = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
Graphics2D g = bi.createGraphics();
g.drawImage(image, 0, 0, width, height, null);
g.setFont(new Font(FONT_NAME, FONT_STYLE, FONT_SIZE));
g.setColor(FONT_COLOR);
int textWidth = this.getTextLength(MARK_TEXT);
int textHeight = FONT_SIZE;
int widthOff = width - textWidth;
int heightOff = height - textHeight;
int x = X;
int y = Y;
if (x > widthOff) {
x = widthOff;
}
if (y > heightOff) {
y = heightOff;
}
g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, ALPHA));
g.drawString(MARK_TEXT, x, y + FONT_SIZE);
g.dispose();
ImageIO.write(bi, fileFileName.substring(fileFileName.indexOf('.') + 1), out);
} catch (Exception e) {
e.printStackTrace();
} finally {
if (out != null) {
try {
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return uploadPath + "/font_" + fileFileName;
}
public int getTextLength(String text) {
int length = 0;
// 存储文字的像素长度,中文字是英文字母的两倍宽度,取其宽度是为了防止它超出图片的范围
int pixValue = 0;
for (int i = 0; i < text.length(); i++) {
length = String.valueOf(text.getBytes()).length();
if (length > 1) {
pixValue += FONT_SIZE;
} else {
pixValue += FONT_SIZE / 2;
}
}
return pixValue;
}
}
  图片水印



package youth.hong.watermark;
import java.awt.AlphaComposite;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import javax.imageio.ImageIO;
public class ImageWaterMark implements WaterMark {
@Override
public String watermark(File file, String uploadPath, String realUploadPath, String fileFileName,
String fileContextType) {
OutputStream out = null;
File f = new File(realUploadPath + "/" + IMAGE_WATER);
System.out.println(f);
try {
out = new FileOutputStream(realUploadPath + "/image_" + fileFileName);
Image image = ImageIO.read(file);
Image imageWater = ImageIO.read(f);
int width = image.getWidth(null);
int height = image.getHeight(null);
BufferedImage bi = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
Graphics2D g = bi.createGraphics();
g.drawImage(image, 0, 0, width, height, null);
int imageWidth = imageWater.getWidth(null);
int imageHeight = imageWater.getHeight(null);
int widthOff = width - imageWidth;
int heightOff = height - imageHeight;
int x = X;
int y = Y;
if (x > widthOff) {
x = widthOff;
}
if (y > heightOff) {
y = heightOff;
}
g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, 0.7f));
g.drawImage(imageWater, x, y, null);
g.dispose();
ImageIO.write(bi, fileFileName.substring(fileFileName.indexOf('.') + 1), out);
} catch (Exception e) {
e.printStackTrace();
} finally {
if (out != null) {
try {
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return uploadPath + "/image_" + fileFileName;
}

}
  多文字水印



package youth.hong.watermark;
import java.awt.AlphaComposite;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import javax.imageio.ImageIO;
public class MoreFontWaterMark implements WaterMark {
@Override
public String watermark(File file, String uploadPath, String realUploadPath, String fileFileName,
String fileContextType) {
OutputStream out = null;
try {
out = new FileOutputStream(realUploadPath + "/font_" + fileFileName);
Image image = ImageIO.read(file);
int width = image.getWidth(null);
int height = image.getHeight(null);
BufferedImage bi = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
Graphics2D g = bi.createGraphics();
g.drawImage(image, 0, 0, width, height, null);
g.setFont(new Font(FONT_NAME, FONT_STYLE, FONT_SIZE));
g.setColor(FONT_COLOR);
g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, ALPHA));
//倾斜画布,以画布的中心点倾斜30°
g.rotate(Math.toRadians(30), bi.getWidth() / 2, bi.getHeight() / 2);
int textWidth = this.getTextLength(MARK_TEXT);
int x = -width / 2;
while(x < width * 2) {

int y = -height / 2;
while(y < height * 2) {
g.drawString(MARK_TEXT, x, y);
y += 100;
}
x = x + 100 + textWidth;
}

g.dispose();
ImageIO.write(bi, fileFileName.substring(fileFileName.indexOf('.') + 1), out);
} catch (Exception e) {
e.printStackTrace();
} finally {
if (out != null) {
try {
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return uploadPath + "/font_" + fileFileName;
}
public int getTextLength(String text) {
int length = 0;
// 存储文字的像素长度
int pixValue = 0;
for (int i = 0; i < text.length(); i++) {
length = String.valueOf(text.getBytes()).length();
if (length > 1) {
pixValue += FONT_SIZE;
} else {
pixValue += FONT_SIZE / 2;
}
}
return pixValue;
}

}
  多图片水印



package youth.hong.watermark;
import java.awt.AlphaComposite;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import javax.imageio.ImageIO;
public class MoreImageWaterMark implements WaterMark {
@Override
public String watermark(File file, String uploadPath, String realUploadPath, String fileFileName,
String fileContextType) {
OutputStream out = null;
File f = new File(realUploadPath + "/" + IMAGE_WATER);
try {
out = new FileOutputStream(realUploadPath + "/moreImage_" + fileFileName);
Image image = ImageIO.read(file);
Image imageWater = ImageIO.read(f);
int width = image.getWidth(null);
int height = image.getHeight(null);
BufferedImage bi = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
Graphics2D g = bi.createGraphics();
g.drawImage(image, 0, 0, width, height, null);
g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, ALPHA));
//倾斜画布,以画布的中心点倾斜30°
g.rotate(Math.toRadians(30), bi.getWidth() / 2, bi.getHeight() / 2);
int imageWidth = imageWater.getWidth(null);
int imageHeight = imageWater.getHeight(null);

int x = -width / 2;
while(x < width * 2) {

int y = -height / 2;
while(y < height * 2) {
g.drawImage(imageWater, x, y, null);
y += 100 + imageHeight;
}
x = x + 100 + imageWidth;
}

g.dispose();
ImageIO.write(bi, fileFileName.substring(fileFileName.indexOf('.') + 1), out);
} catch (Exception e) {
e.printStackTrace();
} finally {
if (out != null) {
try {
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return uploadPath + "/moreImage_" + fileFileName;
}
}
  上传服务类



package youth.hong.watermark;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
public class UploadService {
public String upload(File file, String uploadPath, String realUploadPath, String fileFileName,
String fileContextType) {
InputStream in = null;
OutputStream out = null;
try {
in = new FileInputStream(file);
out = new FileOutputStream(realUploadPath + "/" + fileFileName);
byte[] buff = new byte[1024];
while ((in.read(buff)) > 0) {
out.write(buff);
}
} catch (Exception e) {
System.out.println("请求的操作无法在使用用户映射区域打开的文件上执行。");
} finally {
try {
if (in != null) {
in.close();
}
if (out != null) {
out.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
return uploadPath + "/" + fileFileName;
}
}
  action



package youth.hong.watermark;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionSupport;
public class WaterMarkAction extends ActionSupport {
private static final long serialVersionUID = 1L;
private List<File> file;
private List<String> fileContentType;
private List<String> fileFileName;
private List<String> srcs;
public List<String> getSrcs() {
return srcs;
}
public void setSrcs(List<String> srcs) {
this.srcs = srcs;
}
@Override
public String execute() throws Exception {
dealWithFiles();
return SUCCESS;
}
public String upload() {
return "upload";
}
public List<File> getFile() {
return file;
}
public void setFile(List<File> file) {
this.file = file;
}
public List<String> getFileContentType() {
return fileContentType;
}
public void setFileContentType(List<String> fileContentType) {
this.fileContentType = fileContentType;
}
public List<String> getFileFileName() {
return fileFileName;
}
public void setFileFileName(List<String> fileFileName) {
this.fileFileName = fileFileName;
}
public void dealWithFiles() {
List<String> imageSrcs = new ArrayList<String>();
//        UploadService us = new UploadService();
WaterMark wm = new MoreImageWaterMark();

String uploadPath = "/images";
String realUploadPath = ServletActionContext.getServletContext().getRealPath("/images");
System.out.println(realUploadPath);
for (int i = 0; i < file.size(); i++) {
// String imageSrc = us.upload(file.get(i), uploadPath,
// realUploadPath, fileFileName.get(i), fileContentType.get(i));
// String imageSrc = fwm.watermark(file.get(i), uploadPath,
// realUploadPath, fileFileName.get(i), fileContentType.get(i));
String imageSrc = wm.watermark(file.get(i), uploadPath, realUploadPath, fileFileName.get(i),
fileContentType.get(i));
imageSrcs.add(imageSrc);
System.out.println(imageSrc);
}
this.setSrcs(imageSrcs);
}
}
  struts.xml



<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<constant name="struts.enable.DynamicMethodInvocation" value="true" />
<constant name="struts.devMode" value="true" />
<constant name="struts.multipart.saveDir" value="/image" />
<constant name="struts.multipart.maxSize" value="2097152" />
<package name="default" namespace="/" extends="struts-default">
<action name="watermark" class="youth.hong.watermark.WaterMarkAction">
<result>
/index.jsp
</result>
<result name="upload">
/watermark.jsp
</result>
</action>
</package>
</struts>
  web.xml



<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app>
<display-name>Archetype Created Web Application</display-name>
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
  pom.xml



<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>youth.hong.watermark</groupId>
<artifactId>watermark-parent</artifactId>
<version>0.0.1-SNAPSHOT</version>
<!-- 如果install了那么可以不写也找的到 -->
<relativePath>../watermark-parent/pom.xml</relativePath>
</parent>
<artifactId>watermark-main</artifactId>
<packaging>war</packaging>
<name>watermark-main Maven Webapp</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
</dependency>
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-core</artifactId>
</dependency>
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
</dependency>
<dependency>
<groupId>taglibs</groupId>
<artifactId>standard</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
  index.jsp



<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%
String path = request.getServletPath();
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
esrfgdfbdfgb
<s:iterator value="srcs" var="src">
<img  alt="图片加载失败!" src='<s:property value="#src"/>' />
</s:iterator>


</body>
</html>
  watermark.jsp



<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="<%=request.getServletPath() %>/watermark!execute" method="post" enctype="multipart/form-data">
<input type="file" name="file" /><br />
<input type="file" name="file" /><br />
<input type="file" name="file" /><br />
<input type="file" name="file" /><br />
<input type="file" name="file" /><br />
<input  type="submit" value="submit" />

</form>
</body>
</html>

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-349429-1-1.html 上篇帖子: 搭建spark+hadoop平台 下篇帖子: 大数据技术Hadoop笔试题
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表