给上传的图片添加水印--在流文件中添加

工作中遇到要用java在后台给移动端上传上来的图片添加一个时间的水印。上传上来的本来是图片流。我在网上搜索的都是给图片添加的,但是我又不想通过流生成临时图片,添加水印之后再上传。所以修改了一下网上的那种给文件添加水印的方法,现在传进去从前台或者移动端上传的文件即可添加上水印。

代码如下:

   /**  
     * 添加文字水印  
     * @param pressText 水印文字,  
     * @param x 水印文字距离目标图片左侧的偏移量,如果x<0, 则在正中间  
     * @param y 水印文字距离目标图片上侧的偏移量,如果y<0, 则在正中间  
     *          注:若x,y都等于1,则在图片的右下方
     * @param alpha 透明度(0.0 -- 1.0, 0.0为完全透明,1.0为完全不透明)  
     */  
    public void pressText(MultipartFile attach,String pressText,int x,int y,float alpha){  
        try {  
            CommonsMultipartFile cf= (CommonsMultipartFile)attach; //这个myfile是MultipartFile的
            DiskFileItem fi = (DiskFileItem)cf.getFileItem(); 
            File file = fi.getStoreLocation();
            Image image = ImageIO.read(file);  
            int width = image.getWidth(null);  
            int height = image.getHeight(null);  
            
            BufferedImage bufferedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);  
            Graphics2D g = bufferedImage.createGraphics();  
            g.drawImage(image,0,0, width, height, null);  
            g.setFont(new Font("微软雅黑",Font.BOLD,24));  
            g.setBackground(Color.white);
            g.setColor(Color.red);  
            g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, alpha));  
              
            int width_wi = 24*getTextLength(pressText);  
            int height_wi = 24;  
              
            int widthDiff = width-width_wi;  
            int heightDiff = height-height_wi;  
            if(x<0){  
                x = widthDiff/2;  
            }else if(x>widthDiff){  
                x=widthDiff;  
            }  
              
            if(y<0){  
                y = heightDiff/2;  
            }else if(y>heightDiff){  
                y = heightDiff;  
            }  
            if(x==1&&y==1){
                x = width-width_wi-70;
                y = height-height_wi;
            }
            g.drawString(pressText, x, y);//水印文件  y+height_wi
            g.dispose();  
            ImageIO.write(bufferedImage, "JPEG", file);  
        } catch (IOException e) {  
            e.printStackTrace();  
        }  
    }
    /** 
     * 计算文字像素长度 
     * @param text 
     * @return 
     */  
    private int getTextLength(String text){  
        int textLength = text.length();  
        int length = textLength;  
        for (int i = 0; i < textLength; i++) {  
            int wordLength = String.valueOf(text.charAt(i)).getBytes().length;  
            if(wordLength > 1){  
                length+=(wordLength-1);  
            }  
        }  
          
        return length%2==0 ? length/2:length/2+1;  
    }
上传的接口代码如下
      @RequestMapping(value = "/upload",method=RequestMethod.POST)
    @ResponseBody
    public String uploadFile(@RequestParam("files") MultipartFile[] files,HttpServletRequest request, HttpServletResponse response){
        List<String> pathArray = new LinkedList<String>();
        String retStr = "";
        try {
            //FileManagerConfig.TRACKER_NGNIX_ADDR = fastDFS;
        // 获取文件后缀名 
            for(MultipartFile attach:files){
                //1.0代表水印不透明,0.1-1.0为透明度设置
                pressText(attach, "这里是你要添加的水印文字", 1, 1, 1.0f);
                System.out.println("attach.getOriginalFilename()======"+attach.getOriginalFilename());
                String ext = attach.getOriginalFilename().substring(attach.getOriginalFilename().lastIndexOf(".")+1);
                //下面的attach.getBytes()获取的字节流中就带有水印了。下面的方法是上传到图片服务器的。
                FastDFSFile file = new FastDFSFile(attach.getBytes(),ext);
                NameValuePair[] meta_list = new NameValuePair[4];
                meta_list[0] = new NameValuePair("fileName", attach.getOriginalFilename());
                meta_list[1] = new NameValuePair("fileLength", String.valueOf(attach.getSize()));
                meta_list[2] = new NameValuePair("fileExt", ext);
                meta_list[3] = new NameValuePair("fileAuthor", "hzxh");
                String filePath = FileManager.upload(file,meta_list);
                pathArray.add(filePath);
            }
            for(int i=0;i<pathArray.size();i++){
                retStr += pathArray.get(i);
                if(i<pathArray.size()-1)retStr += "@";
            }
        } catch (IOException  e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        System.out.println("------添加图片-----------" + retStr);
        return retStr;
    }

 

因为移动端一次上传多个文件,所以我用的一个数组接收的上传的文件。

上传到文件服务器的源码见:http://download.csdn.net/download/it_java_shuai/9960309

希望可以帮到大家!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

异常的昵称

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值