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

工作中遇到要用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

希望可以帮到大家!

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
在uniapp上传图片/视频并添加水印后显示在页面内,可以按照以下步骤: 1. 在前端页面添加一个文件上传控件和一个用于显示上传结果的标签,例如: ```html <template> <div> <input type="file" ref="fileInput" @change="uploadFile"> <div v-if="imageUrl"> <img :src="imageUrl"> </div> <div v-if="videoUrl"> <video :src="videoUrl" controls></video> </div> </div> </template> ``` 2. 在前端编写上传文件的逻辑,可以使用uniapp提供的上传组件,例如: ```js methods: { // 上传文件 uploadFile() { const file = this.$refs.fileInput.files[0] uni.uploadFile({ url: '/upload', filePath: file.tempFilePath, name: 'file', success: (res) => { console.log('上传成功', res) const data = JSON.parse(res.data) if (data.type === 'image') { this.imageUrl = data.url } else if (data.type === 'video') { this.videoUrl = data.url } }, fail: (err) => { console.log('上传失败', err) } }) } } ``` 3. 在后端编写一个接口,用于接收上传文件添加水印。可以使用Java、PHP等语言实现添加水印的逻辑,下面以Java为例。在接口,可以使用以下代码实现添加水印并返回文件的URL: ```java // 获取上传文件 Part filePart = request.getPart("file"); String fileName = filePart.getSubmittedFileName(); InputStream fileContent = filePart.getInputStream(); // 添加水印 Image image = ImageIO.read(fileContent); Graphics2D g = image.createGraphics(); g.drawImage(image, 0, 0, null); g.setFont(new Font("Arial", Font.BOLD, 30)); g.setColor(Color.RED); g.drawString("Watermark", 10, 30); g.dispose(); // 保存文件服务器 File file = new File("/path/to/save/" + fileName); ImageIO.write(image, "jpg", file); // 返回文件的URL和类型 Map<String, String> result = new HashMap<>(); result.put("url", "/path/to/save/" + fileName); if (fileName.endsWith(".jpg") || fileName.endsWith(".png")) { result.put("type", "image"); } else if (fileName.endsWith(".mp4") || fileName.endsWith(".mov")) { result.put("type", "video"); } String jsonResult = new Gson().toJson(result); response.setContentType("application/json"); response.setCharacterEncoding("UTF-8"); response.getWriter().write(jsonResult); ``` 以上是uniapp上传图片/视频并添加水印后显示在页面内的基本步骤,需要注意的是,添加水印和显示文件需要使用服务器端的代码实现,客户端无法实现。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

异常的昵称

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

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

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

打赏作者

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

抵扣说明:

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

余额充值