文档章节

使用Java为图片添加水印

杨润康Bla
 杨润康Bla
发布于 2016/05/18 18:04
字数 1502
阅读 5
收藏 0
点赞 2
评论 0

首先新建Web项目,建立完成之后,新建各种文件,新建完成之后项目结构图如下所示:

这里写图片描述

ImageMarkService.java

package com.watermart;

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.OutputStream;

import javax.imageio.ImageIO;

import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGImageEncoder;

public class ImageMarkService implements MarkService {

    @Override
    public String watermark(File image, String imageFileName,
            String uploadPath, String realUploadPath) {
        /**水印图片相关信息Start**/
        String logoFileName = "logo_"+imageFileName;
        OutputStream os = null;
        /**水印图片相关信息End**/

        //Logo的路径
        String logoPath=realUploadPath + "/" + LOGO;

        try {
            //获取传过来的图片的宽和高
            Image readImage = ImageIO.read(image);
            int width = readImage.getWidth(null);
            int height = readImage.getHeight(null);
            //1.
            BufferedImage bufferedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
            //2.
            Graphics2D g = bufferedImage.createGraphics();
            //3.
            g.drawImage(readImage, 0, 0, width, height,null);
            //4.
                //操作logo文件
            File logo = new File(logoPath);
            Image logoImage = ImageIO.read(logo);
            int logoWidth = logoImage.getWidth(null);
            int logoHeight = logoImage.getHeight(null);

            int widthDiff = width-logoWidth;
            int heightDiff = height-logoHeight;

            int x = X;
            int y = Y;

            if(x>widthDiff){
                x = widthDiff; 
            }
            if(y>heightDiff){
                y = heightDiff; 
            }
            //透明度
            g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, ALPHA));
            g.drawString(MARK_TEXT, x, y+FONT_SIZE);
            g.drawImage(logoImage, x, y, null);
            g.dispose();
            //5.
            os = new FileOutputStream(realUploadPath+"/"+logoFileName);
            System.out.println("添加图片水印的文件:"+realUploadPath+"/"+logoFileName);
            //6.
            JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(os);
            encoder.encode(bufferedImage);
        } catch (Exception e) {
            e.printStackTrace();
        }finally{
            try {
                if(os != null){
                    os.close();
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        return uploadPath+"/"+logoFileName;
    }

}

MarkService.java

package com.watermart;

import java.awt.Color;
import java.awt.Font;
import java.io.File;

/** * Mark接口 */
public interface MarkService {
    /*一些参数的设置*/
    public static final String MARK_TEXT = "测试水印文字";//水印文字
    public static final String FONT_NAME = "微软雅黑";
    public static final int FONT_STYLE = Font.BOLD;
    public static final int FONT_SIZE = 120;
    public static final Color FONT_COLOR = Color.BLACK;
    //文字的位置
    public static final int X=10;
    public static final int Y=10;
    //水印的透明度
    public static final float ALPHA=0.3F;
    //水印图片的名称
    public static final String LOGO="logo.png";

    String watermark(File image,String imageFileName,String uploadPath,String realUploadPath);

}

PicInfo.java

package com.watermart;

/** * 图片信息 * * 封装 */
public class PicInfo {

    /** * 图片地址URL */
    private String imageURL;
    /** * 水印图片地址URL */
    private String logoImageURL;


    public String getImageURL() {
        return imageURL;
    }
    public void setImageURL(String imageURL) {
        this.imageURL = imageURL;
    }
    public String getLogoImageURL() {
        return logoImageURL;
    }
    public void setLogoImageURL(String logoImageURL) {
        this.logoImageURL = logoImageURL;
    }
}

TextMarkService.java

package com.watermart;

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.OutputStream;

import javax.imageio.ImageIO;

import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGImageEncoder;

public class TextMarkService implements MarkService {

    @Override
    public String watermark(File image, String imageFileName,
            String uploadPath, String realUploadPath) {
        /**水印图片相关信息Start**/
        String logoFileName = "logo_"+imageFileName;
        OutputStream os = null;
        /**水印图片相关信息End**/

        try {
            //获取传过来的图片的宽和高
            Image readImage = ImageIO.read(image);
            int width = readImage.getWidth(null);
            int height = readImage.getHeight(null);
            //1.
            BufferedImage bufferedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
            //2.
            Graphics2D g = bufferedImage.createGraphics();
            //3.
            g.drawImage(readImage, 0, 0, width, height,null);
            //4.
            g.setFont(new Font(FONT_NAME,FONT_STYLE,FONT_SIZE));
            g.setColor(FONT_COLOR);

            int width1 = FONT_SIZE*getTextLength(MARK_TEXT);
            int height1=FONT_SIZE;

            int widthDiff = width-width1;
            int heightDiff = height-height1;

            int x = X;
            int y = Y;

            if(x>widthDiff){
                x = widthDiff; 
            }
            if(y>heightDiff){
                y = heightDiff; 
            }
            //透明度
            g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, ALPHA));
            g.drawString(MARK_TEXT, x, y+FONT_SIZE);
            g.dispose();
            //5.
            os = new FileOutputStream(realUploadPath+"/"+logoFileName);
            System.out.println("添加文字水印的文件:"+realUploadPath+"/"+logoFileName);
            //6.
            JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(os);
            encoder.encode(bufferedImage);
        } catch (Exception e) {
            e.printStackTrace();
        }finally{
            try {
                if(os != null){
                    os.close();
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        return uploadPath+"/"+logoFileName;
    }

    /** * 获得文本长度值 * @param text * @return */
    public int getTextLength(String text){
        int length = text.length();
        for (int i = 0; i < length; i++) {
            String s=String.valueOf(text.charAt(i));
            //判断是中文还是英文 一个中文==2个英文
            if(s.getBytes().length>1){
                length++;
            }
        }
        length = length%2==0?length/2:length/2+1;
        return length;
    }
}

UploadService.java

package com.watermart;

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 {
    /** * 上传图片 * @param image 图片 * @param imageFileName 图片名称 * @param uploadPath 上传路径 * @param realUploadPath 上传的真实路径 存储在磁盘中的文件路径 * @return 文件路径 */
    @SuppressWarnings("unused")
    public String uploadImage(File image,String imageFileName,String uploadPath,String realUploadPath){
        //输入流
        InputStream is = null;
        //输出流
        OutputStream os = null;

        try {
            //将网页中上传的文件放进内存中,之后可以操作了
            is = new FileInputStream(image);
            //输出流
            os = new FileOutputStream(realUploadPath + "/" + imageFileName);

            System.out.println("存储文件的地方:"+realUploadPath + "/" + imageFileName);
            byte[] buffer = new byte[1024];
            int len = 0;
            while((len=is.read(buffer))>0){
                //将缓存区中的数据写出去
                os.write(buffer);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }finally{
            if(is!=null){
                try {
                    is.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

            if(os!=null){
                try {
                    os.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        //返回文件路径
        return uploadPath + "/" + imageFileName;
    }
}

WaterMarkAction.java

package com.watermart;

import java.io.File;

import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.ActionSupport;

public class WaterMarkAction extends ActionSupport {
    private static final long serialVersionUID = 2925392814200518331L;

    private File image; //上传的文件
    private String imageFileName; //图片文件名称不能包含中文,否则会上传失败
    private String uploadPath; //上传路径

    //图片信息
    private PicInfo picInfo = new PicInfo();

    public PicInfo getPicInfo() {
        return picInfo;
    }

    public void setPicInfo(PicInfo picInfo) {
        this.picInfo = picInfo;
    }

    public String getUploadPath() {
        return uploadPath;
    }

    public void setUploadPath(String uploadPath) {
        this.uploadPath = uploadPath;
    }

    public String watermark() throws Exception{
        //获取文件上传的地址
        String realUploadPath = ServletActionContext.getServletContext().getRealPath(uploadPath);
        //构建服务类
        UploadService uploadService = new UploadService();
        //写入硬盘后,获取文件存放的位置
        String imageURL = uploadService.uploadImage(image, imageFileName, uploadPath, realUploadPath);
        //存入文件的地址,用于前台的显示
        picInfo.setImageURL(imageURL);

        MarkService markService = new ImageMarkService();
        picInfo.setLogoImageURL(markService.watermark(image, imageFileName, uploadPath, realUploadPath));
        return SUCCESS;
    }

    public File getImage() {
        return image;
    }

    public void setImage(File image) {
        this.image = image;
    }

    public String getImageFileName() {
        return imageFileName;
    }

    public void setImageFileName(String imageFileName) {
        this.imageFileName = imageFileName;
    }
}

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.devMode" value="true" />

    <!-- 配置请求后缀 -->
    <constant name="struts.action.extension" value="action" />
    <!-- 编码配置 -->
    <constant name="struts.i18n.encoding" value="UTF-8" />
    <!-- 文件上传大小配置 -->
    <constant name="struts.multipart.maxSize" value="1073741824" />
    <!-- 设置上传文件的临时文件夹 -->
    <constant name="struts.multipart.saveDir" value="/tmpUpload" />

    <package name="default" namespace="/" extends="struts-default">
        <action name="watermark" class="com.watermart.WaterMarkAction" method="watermark">
            <!-- 配置参数信息 -->
            <param name="uploadPath">/images</param>

            <result name="success">watermark.jsp</result>
        </action>
    </package>


</struts>

index.jsp

<?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.devMode" value="true" />

    <!-- 配置请求后缀 -->
    <constant name="struts.action.extension" value="action" />
    <!-- 编码配置 -->
    <constant name="struts.i18n.encoding" value="UTF-8" />
    <!-- 文件上传大小配置 -->
    <constant name="struts.multipart.maxSize" value="1073741824" />
    <!-- 设置上传文件的临时文件夹 -->
    <constant name="struts.multipart.saveDir" value="/tmpUpload" />

    <package name="default" namespace="/" extends="struts-default">
        <action name="watermark" class="com.watermart.WaterMarkAction" method="watermark">
            <!-- 配置参数信息 -->
            <param name="uploadPath">/images</param>

            <result name="success">watermark.jsp</result>
        </action>
    </package>


</struts>

watermark.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@taglib uri="/struts-tags" prefix="s"%>
<!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>处理结果</title>
</head>
<body>
    <table width="100%" align="center" border="1">
        <tr>
            <td width="50%">
                <img src="${pageContext.request.contextPath}<s:property value="picInfo.imageURL" />">
            </td>
            <td width="50%">
                <img src="${pageContext.request.contextPath}<s:property value="picInfo.logoImageURL" />">
            </td>
        </tr>
    </table>
</body>
</html>

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
  <display-name>WaterMaker</display-name>
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>

   <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>

效果图
这里写图片描述

本文转载自:http://blog.csdn.net/yangrunkangbla/article/details/50511955

共有 人打赏支持
杨润康Bla
粉丝 14
博文 76
码字总数 0
作品 0
合肥
后端工程师
使用 Grapicmagick 和 Im4java 处理图片

ImageMagick是个图片处理工具可以安装在绝大多数的平台上使用,Linux、Mac、Windows都没有问题。GraphicsMagick是在ImageMagick基础上的另一个项目,大大提高了图片处理的性能,在linux平台上...

voole ⋅ 05/07 ⋅ 0

在JAVA中使用Thumbnails为图片加水印

在JAVA中使用Thumbnails为图片加水印 将D盘下面的cat.jpg作为水印加在2.jpg上面,输出新的图片2_cat.jpg到D盘下面 1、java类 1)、of(new File("D:2.jpg")) 打开一张图片作为底图 2)、size(20...

Qiu_CJ ⋅ 04/18 ⋅ 0

Java 借助ImageMagic实现图片编辑服务

Java 借助ImageMagic实现图片编辑服务 java原生对于图片的编辑处理并没有特别友好,而且问题也有不少,那么作为一个java后端,如果要提供图片的编辑服务可以怎么办?也得想办法去支持业务需求...

小灰灰Blog ⋅ 04/18 ⋅ 0

Java环境变量的配置 (Win10环境下)

一、已安装jdk 的win10计算机 1、首先找到‘此电脑’,右击选择属性 2、选择高级系统设置 3、选择环境变量 4、选择新建,变量名为 (JAVAHOME) 变量值为是之前安装jdk的路径,我的是安装在E:P...

ling118 ⋅ 05/08 ⋅ 0

sharding-jdbc源码分析—准备工作

原文作者:阿飞Javaer 原文链接:https://www.jianshu.com/p/7831817c1da8 接下来对sharding-jdbc源码的分析基于tag为源码,根据sharding-jdbc Features深入学习sharding-jdbc的几个主要特性...

飞哥-Javaer ⋅ 05/03 ⋅ 0

Maven的安装文字版(Windows/Linux/Mac)

以下内容引用自https://ayayui.gitbooks.io/tutorialspoint-maven/content/book/mavenenvironment_setup.html,安装信息更新到最新版本: Maven是基于Java的工具,所以首要必须的要求是你的电...

easonjim ⋅ 2017/05/07 ⋅ 0

java程序员基础进阶篇,万丈高楼平地起

一.final,finally,finalize 三者区别 Final是一个修饰符: 当final修饰一个变量的时候,变量变成一个常量,它不能被二次赋值 当final修饰的变量为静态变量(即由static修饰)时,必须在声明这...

启示录是真的 ⋅ 05/26 ⋅ 0

Java 9 被无情抛弃,Java 8 直接升级到 Java 10!!

前几天写了一篇 Java 8 即将在 2019 年停止免费向企业提供更新的文章,企图迫使用户向更新一代的 Java 版本升级,但让人遗憾的是,小编今天收到了 Oracle Java 版本的升级推送,装完居然是 ...

Java技术栈 ⋅ 04/27 ⋅ 0

🛠VS Code编辑器配置Java开发环境

🛠VS Code编辑器配置Java开发环境 一、简述 及讨论 由于学校课程的原因,是基本以java开发为主线的课程,但是我对java兴趣不大,又加上我不太喜欢 「Eclipse」这个java的集成开发环境(简称...

Cc卿 ⋅ 06/02 ⋅ 0

Java NIO AsynchronousFileChannel

原文链接 , 原文作者:Jakob Jenkov, 翻译:Neil Hao 在Java 7,AsynchronousFileChannel 被添加到了Java NIO中。使用AsynchronousFileChannel可以实现异步地读取和写入文件数据。 创建一个A...

Neil_Hao ⋅ 01/20 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Kubeflow实战系列:利用TFJob导出分布式TensorFlow模型

介绍 本系列将介绍如何在阿里云容器服务上运行Kubeflow, 本文介绍如何使用TfJob导出分布式模型训练模型。 第一篇:阿里云上使用JupyterHub 第二篇:阿里云上小试TFJob 第三篇:利用TFJob运行...

全部原谅 ⋅ 13分钟前 ⋅ 0

007. 深入JVM学习—老年代

老年代空间的主要目的是用于存储由Eden发送来的对象,一般在经历好几次“Minor GC”还会保存下来的对象,才会被复制到老年代,这样就可以存放更多的对象,同时在老年代中执行GC的次数也相对较...

影狼 ⋅ 14分钟前 ⋅ 0

常见的一些C#开源框架或者开源项目

原:https://blog.csdn.net/qq_27825451/article/details/70666044 Json.NET http://json.codeplex.com/ Json.Net 是一个读写Json效率比较高的.Net框架.Json.Net 使得在.Net环境下使用Json更......

whoisliang ⋅ 15分钟前 ⋅ 0

设计模式基本原理

刚开始接触编程这行的时候看过设计模式,当时感觉学这些模式没有太大的用处,当时也看不太懂。但是随着慢慢接触这一行,经过一段时间的编程以后,再回过头来看设计模式,发现设计模式的确是太...

王子城 ⋅ 18分钟前 ⋅ 0

阿里云全面支持IPv6!一文揽尽4位大咖精彩演讲

摘要: 自从去年11月以来,阿里巴巴高度重视数据中心的网络改造、云产品改造、应用及网络改造等多个维度,经过半年以来的建设,阿里云已经完成了域名解析等关键产品的分析,现在阿里云已经完...

传授知识的天使 ⋅ 29分钟前 ⋅ 0

windows Android sdk 配置

1、下载Android SDK,点击安装,直接默认路径即可! 下载地址:http://developer.android.com/sdk/index.html 2、默认路径安装后,安装完成,开始配置环境变量。 3、打开计算机属性——高级系...

阿豪boy ⋅ 31分钟前 ⋅ 0

bash shell script 简明教程

User <--> bash <--> kernel shell is not kernel or part of kernel various shells: tcsh, csh, bash, ksh find the using shell: echo $SHELL find all the shells: cat /etc/shells what......

mskk ⋅ 34分钟前 ⋅ 0

Service Mesh简史

William Morgan Service Mesh是一个相当新的概念,讲它的“历史”似乎有些勉强。就目前而言,Service Mesh已经在部分企业生产环境中运行了超过18个月,它的源头可以追溯到2010年前后互联网公...

好雨云帮 ⋅ 34分钟前 ⋅ 0

10个免费的服务器监控工具

监控你的WEB服务器或者WEB主机运行是否正常与健康是非常重要的。你要确保用户始终可以打开你的网站并且网速不慢。服务器监控工具允许你收集和分析有关你的Web服务器的数据。 有许多非常好的服...

李朝强 ⋅ 46分钟前 ⋅ 0

压缩工具之zip-tar

zip 支持目录压缩。使用yum安装zip包,使用yum安装unzip包 zip 1.txt.zip 1.txt #将1.txt文件压缩,新生成的压缩文件为1.txt.zip,原文件保留 zip -r 123.zip 123/ #-r对目录操作。将123/目录...

ZHENG-JY ⋅ 47分钟前 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部