为上传到服务器的图片添加水印

本文介绍如何使用Spring MVC框架实现图片上传功能,并通过Java AWT库为上传的图片添加文字水印。具体包括Controller层接收文件、Service层处理图片及添加水印等关键步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

小葵花课堂开奖啦,上传图片想带文字水印肿么办,看下方例子:

  • 嗯,是个栗子:

> 上传图片和加水印:

代码块

基于Spring,SpringMVC,Mybatis框架开发:
1.Controller:
@Controller
@RequestMapping(“/loading”)
public class Bannercontroller {
@Autowired
private BannerServie bs;
@RequestMapping(“/file”)
public String LoaderBanner(MultipartHttpServletRequest file,HttpServletRequest req){
List<~> list = file.getFiles(“file”);

    for (MultipartFile multipartFile : list) {
        bs.addBanner(multipartFile,req);
    }
    return "/ok.jsp";
}

}
2.Service

import java.awt.AlphaComposite;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.RenderingHints;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.UUID;

import javax.imageio.ImageIO;
import javax.servlet.http.HttpServletRequest;

import org.apache.commons.io.FilenameUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;

import com.apache.dao.BannerDao;
import com.apache.entity.Banner;
import com.baizhi.util.ImageRemarkUtil;

@Service
@Transactional
public class BannerServiceImp implements BannerServie{
    @Autowired
    private BannerDao bannerDao;

    // 水印透明度
    private static float alpha = 0.5f;
    // 水印横向位置
    private static int positionWidth = 100;
    // 水印纵向位置
    private static int positionHeight = 100;
    // 水印文字字体
    private static Font font = new Font("宋体", Font.BOLD, 72);
    // 水印文字颜色
    private static Color color = Color.red;
    // 水印图片间隔
    private static int interval = 0;

    @Override
    public void addBanner(MultipartFile file, HttpServletRequest req) {

        //获取本项目的路径
        String realpath= req.getSession().getServletContext().getRealPath("/");
        //获取上级目录
        String webapps = new File(realpath).getParent();
        //创建上传的目录
        File file2 = new File(webapps,"loadup");
        //判断覅le是否存在 如果存在就创建新的文件路径
        if(!file2.exists()){
            file2.mkdir();
        }

        /**以上的方法是创建目录 
         * 修改文件名时间戳+ UUID+"."+后缀
         */
        //获取原来文件的名字
        String file3 = file.getOriginalFilename();

        //创建时间戳  
        String filename=new SimpleDateFormat("yyyyMMddHHmmssSS").format(new Date())
        +UUID.randomUUID().toString().replace("-", "")+"."+FilenameUtils.getExtension(file3);


        //上传文件状态 文件路径 id 放入数据库
        File file4 = new File(file2,filename);

        OutputStream os = null;
        try {
            file.transferTo(file4);
            // 1、源图片
            Image srcImg = ImageIO.read(file4);
            BufferedImage buffImg = new BufferedImage(srcImg.getWidth(null),
                    srcImg.getHeight(null), BufferedImage.TYPE_INT_RGB);

            // 2、得到画笔对象
            Graphics2D g = buffImg.createGraphics();
            // 3、设置对线段的锯齿状边缘处理
            g.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
                    RenderingHints.VALUE_INTERPOLATION_BILINEAR);
            g.drawImage(
                    srcImg.getScaledInstance(srcImg.getWidth(null),
                            srcImg.getHeight(null), Image.SCALE_SMOOTH), 0, 0,
                    null);

            // 5、设置水印文字颜色
            g.setColor(color);
            // 6、设置水印文字Font
            g.setFont(font);
            // 7、设置水印文字透明度
            g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP,
                    alpha));
            // 8、第一参数->设置的内容,后面两个参数->文字在图片上的坐标位置(x,y)
            g.drawString("版权所有,侵权必究", positionWidth, positionHeight);
            // 9、释放资源
            g.dispose();

            // 10、生成图片
            os = new FileOutputStream(file4);

            ImageIO.write(buffImg, "JPG", os);

            String netpath=req.getScheme()+"://"+req.getServerName()+":"+req.getServerPort()
            +File.separator+"loadup"+File.separator+filename;

            String id = UUID.randomUUID().toString().replace("-", "");
            //调取方法那id netpath 入库
            Banner banner = new Banner(id,"name",netpath,"1","1",new Date());
            bannerDao.Uploaderpath(banner);


        } catch (IllegalStateException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }finally{
            try {
                if (null != os)
                    os.close();//关闭流
            } catch (Exception e) {
                e.printStackTrace();
            }
        }   
    }

重点内容

脚注

参考:http://blog.youkuaiyun.com/zengshunyao/article/details/44758297[^footnote].

流程图:

Created with Raphaël 2.1.0 开始 读取上传的图片加水印 从哪来回哪儿去 结束 yes no
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值