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

xiaoxiao2021-02-28  106

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

希望可以帮到大家!

转载请注明原文地址: https://www.6miu.com/read-68649.html

最新回复(0)